Index: flang/lib/Semantics/resolve-names.cpp =================================================================== --- flang/lib/Semantics/resolve-names.cpp +++ flang/lib/Semantics/resolve-names.cpp @@ -2329,6 +2329,10 @@ .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; } Index: flang/test/Semantics/resolve119.f90 =================================================================== --- /dev/null +++ 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 +