diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp index e5a01657e4a15..0a0601cb04c85 100644 --- a/flang/lib/Semantics/check-declarations.cpp +++ b/flang/lib/Semantics/check-declarations.cpp @@ -363,7 +363,10 @@ void CheckHelper::Check(const Symbol &symbol) { // are not pertinent to the characteristics of the procedure. // Restrictions on entities in pure procedure interfaces don't need // enforcement. - } else if (!FindCommonBlockContaining(symbol) && IsSaved(symbol)) { + } else if (symbol.has() || + FindCommonBlockContaining(symbol)) { + // can look like they have SAVE but are fine in PURE + } else if (IsSaved(symbol)) { if (IsInitialized(symbol)) { messages_.Say( "A pure subprogram may not initialize a variable"_err_en_US); diff --git a/flang/test/Semantics/call10.f90 b/flang/test/Semantics/call10.f90 index 81c28082a843f..47976ca9630cd 100644 --- a/flang/test/Semantics/call10.f90 +++ b/flang/test/Semantics/call10.f90 @@ -36,6 +36,8 @@ pure subroutine s05a end subroutine end interface + real :: moduleVar = 1. + contains subroutine impure(x) @@ -117,6 +119,8 @@ pure subroutine s05 ! C1589 !ERROR: A pure subprogram may not initialize a variable real :: v6 = 0. end block + associate (x => moduleVar) ! ok + end associate end subroutine pure subroutine s06 ! C1589 !ERROR: A pure subprogram may not have a variable with the VOLATILE attribute