https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83469
Bug ID: 83469 Summary: union is not accepted as a valid class-key in template name resolution Product: gcc Version: 5.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: smw at gcc dot gnu.org Target Milestone: --- The following code is accepted by clang, icc, and msvc (all versions tested) but is rejected with all version of GCC (tested from 4.0 though 7.1). struct S { union U { int m; }; }; template <typename T> void f() { union T::U u; } int main() { f<S>(); } The compilation error is as follows. $ g++ -Wall -Wextra -pedantic -o tun tun.cpp tun.cpp: In function ‘void f()’: tun.cpp:7:14: error: ‘union’ tag used in naming ‘class T::U’ [-fpermissive] { union T::U u; } ^ tun.cpp:7:14: note: ‘class T::U’ was previously declared here tun.cpp: In instantiation of ‘void f() [with T = S]’: tun.cpp:12:8: required from here Note that nothing in ISO/IEC 14882:2014 16.6/5 [temp.res] implies the class-key 'union' should be treated differently than the class-key 'struct' or 'class' when resolving qualified names.