On Tue, May 01, 2018 at 08:52:42AM -0400, Jason Merrill wrote: > 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?
I think this should be safe even without another rc, please check it into 8.1. Thanks. > 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; > + } > + > +} Jakub