diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index fa782f3b414b3..4a4841d5a9362 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -2329,6 +2329,10 @@ Symbol &ScopeHandler::MakeHostAssocSymbol( .first->second}; name.symbol = &symbol; symbol.attrs() = hostSymbol.attrs(); // TODO: except PRIVATE, PUBLIC? + // These attributes can be redundantly reapplied without error + // on the host-associated name, at most once (C815). + symbol.implicitAttrs() = + symbol.attrs() & Attrs{Attr::ASYNCHRONOUS, Attr::VOLATILE}; symbol.flags() = hostSymbol.flags(); return symbol; } diff --git a/flang/test/Semantics/resolve119.f90 b/flang/test/Semantics/resolve119.f90 new file mode 100644 index 0000000000000..71294303d7951 --- /dev/null +++ b/flang/test/Semantics/resolve119.f90 @@ -0,0 +1,78 @@ +! RUN: %python %S/test_errors.py %s %flang_fc1 +! C815: an attribute may be applied at most once per scope +module m + real a1, a2, v1, v2 + asynchronous a1 + asynchronous a2 + !ERROR: ASYNCHRONOUS attribute was already specified on 'a2' + asynchronous a2 + volatile v1 + volatile v2 + !ERROR: VOLATILE attribute was already specified on 'v2' + volatile v2 + contains + subroutine modsub + asynchronous a1 + asynchronous a2 + !ERROR: ASYNCHRONOUS attribute was already specified on 'a2' + asynchronous a2 + volatile v1 + volatile v2 + !ERROR: VOLATILE attribute was already specified on 'v2' + volatile v2 + block + asynchronous a1 + asynchronous a2 + !ERROR: ASYNCHRONOUS attribute was already specified on 'a2' + asynchronous a2 + volatile v1 + volatile v2 + !ERROR: VOLATILE attribute was already specified on 'v2' + volatile v2 + end block + end +end + +subroutine s + use m + asynchronous a1 + asynchronous a2 + !ERROR: ASYNCHRONOUS attribute was already specified on 'a2' + asynchronous a2 + volatile v1 + volatile v2 + !ERROR: VOLATILE attribute was already specified on 'v2' + volatile v2 + block + asynchronous a1 + asynchronous a2 + !ERROR: ASYNCHRONOUS attribute was already specified on 'a2' + asynchronous a2 + volatile v1 + volatile v2 + !ERROR: VOLATILE attribute was already specified on 'v2' + volatile v2 + end block + contains + subroutine internal + asynchronous a1 + asynchronous a2 + !ERROR: ASYNCHRONOUS attribute was already specified on 'a2' + asynchronous a2 + volatile v1 + volatile v2 + !ERROR: VOLATILE attribute was already specified on 'v2' + volatile v2 + block + asynchronous a1 + asynchronous a2 + !ERROR: ASYNCHRONOUS attribute was already specified on 'a2' + asynchronous a2 + volatile v1 + volatile v2 + !ERROR: VOLATILE attribute was already specified on 'v2' + volatile v2 + end block + end +end +