It wasn't a problem before that we didn't check for namespace scope, because we were only looking at functions. Now that we look at variables as well, we need to consider their scope.
Tested x86_64-pc-linux-gnu, applying to trunk. Jakub, this looks like a P1, should it go into 8.1 as well?
commit a97af841718779b615bd0a599cac956396c8c85a Author: Jason Merrill <ja...@redhat.com> Date: Mon Apr 30 17:37:20 2018 -0400 PR c++/85580 - extern "C" and local variables * name-lookup.c (check_extern_c_conflict): Ignore local decls. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 2af2462825c..64c7b6f006e 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -2527,6 +2527,10 @@ check_extern_c_conflict (tree decl) if (DECL_ARTIFICIAL (decl) || DECL_IN_SYSTEM_HEADER (decl)) return; + /* This only applies to decls at namespace scope. */ + if (!DECL_NAMESPACE_SCOPE_P (decl)) + return; + if (!extern_c_decls) extern_c_decls = hash_table<named_decl_hash>::create_ggc (127); diff --git a/gcc/testsuite/g++.dg/parse/extern-C-2.C b/gcc/testsuite/g++.dg/parse/extern-C-2.C new file mode 100644 index 00000000000..d8a4e14b4b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/extern-C-2.C @@ -0,0 +1,22 @@ +// PR c++/85580 + +extern "C" +{ + + void f1() + { + union some_type{ + char a[2]; + int b; + } variable; + } + + void f2() + { + union some_type{ + char a[2]; + int b; + } variable; + } + +}