http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56820
Bug #: 56820 Summary: elaborated-type-specifier friend incorrectly looked up beyond innermost enclosing namespace Classification: Unclassified Product: gcc Version: unknown Status: UNCONFIRMED Severity: minor Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: w...@leicester.ac.uk Created attachment 29781 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29781 errorneous C++ source which compiles gcc (4.7 & 4.8) using -std=c++11 incorrectly looks up unqualified template friends (not template-id) outside of the innermost enclosing namespace. According to 7.3.1.2, "If the name in a friend declaration is neither qualified nor a template-id and the declaration is a function or an elaborated-type-specifier, the lookup to determine whether the entity has been previously declared shall not consider any scopes outside the innermost enclosing namespace." For example, in this simple code namespace outer { template<typename> class A; namespace details { template<typename> class B { template<typename> friend class A; }; } } template class outer::details::B must not befriend (but does to with gcc) template class outer::A, because the latter is not member of the innermost inclosing namespace. In order to befriend outer::A, the friend declaration would need to be qualified, i.e. template<typename> friend class outer::A; ----------------------- I attach a simple test program which triggers the error: it compiles although it shouldn't. output from g++ -v: Using built-in specs. COLLECT_GCC=/opt/local/bin/g++-mp-4.8 COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/x86_64-apple-darwin12/4.8.0/lto-wrapper Target: x86_64-apple-darwin12 Configured with: ../gcc-4.8-20130321/configure --prefix=/opt/local --build=x86_64-apple-darwin12 --enable-languages=c,c++,objc,obj-c++,fortran,java --libdir=/opt/local/lib/gcc48 --includedir=/opt/local/include/gcc48 --infodir=/opt/local/share/info --mandir=/opt/local/share/man --datarootdir=/opt/local/share/gcc-4.8 --with-local-prefix=/opt/local --with-system-zlib --disable-nls --program-suffix=-mp-4.8 --with-gxx-include-dir=/opt/local/include/gcc48/c++/ --with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --with-ppl=/opt/local --with-cloog=/opt/local --enable-cloog-backend=isl --disable-cloog-version-check --enable-stage1-checking --disable-multilib --enable-lto --enable-libstdcxx-time --with-as=/opt/local/bin/as --with-ld=/opt/local/bin/ld --with-ar=/opt/local/bin/ar --with-bugurl=https://trac.macports.org/newticket --with-pkgversion='MacPorts gcc48 4.8-20130321_0' Thread model: posix gcc version 4.8.0 20130321 (prerelease) (MacPorts gcc48 4.8-20130321_0) compilation command line (on max OS 10.8): g++ -std=c++11 -Wextra -Wall -pedantic simple_test.cc output: working executable writing a.foo(4) = 120 to stderr.