diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp --- a/flang/lib/Semantics/check-declarations.cpp +++ b/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( diff --git a/flang/test/Semantics/call10.f90 b/flang/test/Semantics/call10.f90 --- a/flang/test/Semantics/call10.f90 +++ b/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