Index: flang/lib/Semantics/check-declarations.cpp =================================================================== --- flang/lib/Semantics/check-declarations.cpp +++ flang/lib/Semantics/check-declarations.cpp @@ -237,8 +237,13 @@ } if (InPure()) { if (IsSaved(symbol)) { - messages_.Say( - "A pure subprogram may not have a variable with the SAVE attribute"_err_en_US); + if (IsInitialized(symbol)) { + messages_.Say( + "A pure subprogram may not initialize a variable"_err_en_US); + } else { + messages_.Say( + "A pure subprogram may not have a variable with the SAVE attribute"_err_en_US); + } } if (symbol.attrs().test(Attr::VOLATILE)) { messages_.Say( Index: flang/test/Semantics/call10.f90 =================================================================== --- flang/test/Semantics/call10.f90 +++ flang/test/Semantics/call10.f90 @@ -85,9 +85,9 @@ pure subroutine s05 ! C1589 !ERROR: A pure subprogram may not have a variable with the SAVE attribute real, save :: v1 - !ERROR: A pure subprogram may not have a variable with the SAVE attribute + !ERROR: A pure subprogram may not initialize a variable real :: v2 = 0. - !ERROR: A pure subprogram may not have a variable with the SAVE attribute + !ERROR: A pure subprogram may not initialize a variable real :: v3 data v3/0./ !ERROR: A pure subprogram may not have a variable with the SAVE attribute @@ -97,7 +97,7 @@ block !ERROR: A pure subprogram may not have a variable with the SAVE attribute real, save :: v5 - !ERROR: A pure subprogram may not have a variable with the SAVE attribute + !ERROR: A pure subprogram may not initialize a variable real :: v6 = 0. end block end subroutine