diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md --- a/flang/docs/Extensions.md +++ b/flang/docs/Extensions.md @@ -197,6 +197,8 @@ * External unit 0 is predefined and connected to the standard error output, and defined as `ERROR_UNIT` in the intrinsic `ISO_FORTRAN_ENV` module. * Objects in blank COMMON may be initialized. +* Multiple specifications of the SAVE attribute on the same object + are allowed, with a warning. ### Extensions supported when enabled by options diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -4903,7 +4903,7 @@ std::set &set, const SourceName &name) { auto pair{set.insert(name)}; if (!pair.second) { - Say2(name, "SAVE attribute was already specified on '%s'"_err_en_US, + Say2(name, "SAVE attribute was already specified on '%s'"_en_US, *pair.first, "Previous specification of SAVE attribute"_en_US); } } diff --git a/flang/test/Semantics/resolve107.f90 b/flang/test/Semantics/resolve107.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/resolve107.f90 @@ -0,0 +1,13 @@ +! RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck %s +! Check warning on multiple SAVE attribute specifications +subroutine saves + save x + save y + !CHECK: SAVE attribute was already specified on 'y' + integer, save :: y + integer, save :: z + !CHECK: SAVE attribute was already specified on 'x' + !CHECK: SAVE attribute was already specified on 'z' + save x,z +end + diff --git a/flang/test/Semantics/resolve45.f90 b/flang/test/Semantics/resolve45.f90 --- a/flang/test/Semantics/resolve45.f90 +++ b/flang/test/Semantics/resolve45.f90 @@ -53,17 +53,6 @@ end block end -subroutine s6 - save x - save y - !ERROR: SAVE attribute was already specified on 'y' - integer, save :: y - integer, save :: z - !ERROR: SAVE attribute was already specified on 'x' - !ERROR: SAVE attribute was already specified on 'z' - save x,z -end - subroutine s7 !ERROR: 'x' appears as a COMMON block in a SAVE statement but not in a COMMON statement save /x/