diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp index 5c26469b9fa2..8da9252133bd 100644 --- a/flang/lib/Semantics/check-declarations.cpp +++ b/flang/lib/Semantics/check-declarations.cpp @@ -359,7 +359,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 2d2f57934cd8..1e186f7b4048 100644 --- a/flang/test/Semantics/call10.f90 +++ b/flang/test/Semantics/call10.f90 @@ -36,6 +36,8 @@ module m end subroutine end interface + real :: moduleVar = 1. + contains subroutine impure(x) @@ -117,6 +119,8 @@ module m !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