https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119654

            Bug ID: 119654
           Summary: name lookup after `typename` incorrectly ignores
                    non-type non-namespace names
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: richard-gccbugzilla at metafoo dot co.uk
  Target Milestone: ---

Testcase:

template<typename T> struct X { typedef int type; };
struct Y { typedef int type; };
void f() {
    int X, Y;
    X<int>::type x1;
    typename X<int>::type x2;
    Y::type y;
}

struct Z : X<int>, Y {
    int X, Y;
};
void g() {
    Z::X<int>::type x1;
    typename Z::X<int>::type x2;
    Z::Y::type y;
}

Here, every compiler agrees that in both f and g, x1 is ill-formed because `X`
names the int, and y is valid because name lookup for `Y` in `Y::` ignores
names other than types and namespaces.

However, only GCC accepts x2, because GCC appears to apply the "identifier
before ::" name lookup rule to names following `typename` too. Or perhaps it
forms a simple-template-id, then notices the following `::`, then applies the
"identifier before ::" name lookup rule despite a simple-template-id not being
an identifier. That behavior makes some sense, given that the name can only
name a type or namespace in valid code, but it's wrong -- the standard is quite
clear on this, and all other compilers reject.

See [temp.res.general]/3:

> A typename-specifier denotes the type or class template denoted by the 
> simple-type-specifier ([dcl.type.simple]) formed by omitting the keyword 
> typename.
> [Note 2: The usual qualified name lookup ([basic.lookup.qual]) applies even 
> in the presence of typename. — end note]

GCC doesn't diagnose even under `-pedantic-errors`, so I assume this is a bug
rather than an intentional extension.
  • [Bug c++/119654] New... richard-gccbugzilla at metafoo dot co.uk via Gcc-bugs

Reply via email to