Index: Sema/SemaDecl.cpp =================================================================== --- Sema/SemaDecl.cpp +++ Sema/SemaDecl.cpp @@ -4645,12 +4645,20 @@ unsigned DiagID; if (Record->isUnion()) { // C++ [class.union]p6: + // C++17 [class.union.anon]p2: // Anonymous unions declared in a named namespace or in the // global namespace shall be declared static. + + // We need to get to the parent scope (extern {} is not a scope). + DeclContext *OwnerScope = Owner; + while (OwnerScope->getDeclKind() == Decl::LinkageSpec) { + OwnerScope = OwnerScope->getParent(); + } + if (DS.getStorageClassSpec() != DeclSpec::SCS_static && - (isa(Owner) || - (isa(Owner) && - cast(Owner)->getDeclName()))) { + (isa(OwnerScope) || + (isa(OwnerScope) && + cast(OwnerScope)->getDeclName()))) { Diag(Record->getLocation(), diag::err_anonymous_union_not_static) << FixItHint::CreateInsertion(Record->getLocation(), "static "); Index: SemaCXX/anonymous-union.cpp =================================================================== --- SemaCXX/anonymous-union.cpp +++ SemaCXX/anonymous-union.cpp @@ -80,6 +80,10 @@ float float_val; }; +extern "C++" { +union { }; // expected-error{{anonymous unions at namespace or global scope must be declared 'static'}} +} + static union { int int_val2; // expected-note{{previous definition is here}} float float_val2;