https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81064
Nathan Sidwell <nathan at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED --- Comment #3 from Nathan Sidwell <nathan at gcc dot gnu.org> --- Thanks for the reduced testcase. This is caused by: 2017-05-26 Nathan Sidwell <nat...@acm.org> Implement DR2061 * name-lookup.c (push_inline_namespaces): New. (push_namespace): Look inside inline namespaces. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2061 I think I've implemented it correctly, and that the testcase is ill-formed. Perhaps we could check whenever creating a new namepace that it doesn't cause an ambiguity within the 'local' inline namespace tree. (though, such an ambiguity could occur on declaring any new name, not just a namespace). 2061. Inline namespace after simplifications Section: 7.3.1 [namespace.def] Status: CD4 Submitter: Richard Smith Date: 2014-12-18 [Adopted at the February, 2016 meeting.] After the resolution of issue 1795, 7.3.1 [namespace.def] paragraph 3 now says: In a named-namespace-definition, the identifier is the name of the namespace. If the identifier, when looked up (3.4.1 [basic.lookup.unqual]), refers to a namespace-name (but not a namespace-alias) introduced in the declarative region in which the named-namespace-definition appears, the namespace-definition extends the previously-declared namespace. Otherwise, the identifier is introduced as a namespace-name into the declarative region in which the named-namespace-definition appears. This appears to break code like the following: namespace A { inline namespace b { namespace C { template<typename T> void f(); } } } namespace A { namespace C { template<> void f<int>() { } } } because (by definition of “declarative region”) C cannot be used as an unqualified name to refer to A::b::C within A if its declarative region is A::b. Proposed resolution (September, 2015): Change 7.3.1 [namespace.def] paragraph 3 as follows: In a named-namespace-definition, the identifier is the name of the namespace. If the identifier, when looked up (3.4.1 [basic.lookup.unqual]), refers to a namespace-name (but not a namespace-alias) that was introduced in the declarative region namespace in which the named-namespace-definition appears or that was introduced in a member of the inline namespace set of that namespace, the namespace-definition extends the previously-declared namespace. Otherwise, the identifier is introduced as a namespace-name into the declarative region in which the named-namespace-definition appears.