[cfe-commits] [PATCH] Don't diagnose missing typename at point of definition in case when injected-class-name type has dependant bases.

schaub-johannes at web.de schaub-johannes at web.de
Tue Dec 29 10:20:52 PST 2009

Eli Friedman eli.friedman at gmail.com wrote:
> On Sun, Dec 27, 2009 at 7:35 PM, Piotr Rak <piotr.rak at gmail.com> wrote:
> > Hi,
> >
> > I've not followed changes in clang recently, thus not I am not sure if
> > it is quite correct.
> > This one allows compile <tr1/unordered_map> header from gcc-4.1.2.
> I think the code is invalid.  In the given testcase, "typename
> B::type" isn't a dependent name because "B" refers to the current
> instantiation (in the sense of [temp.dep.type]).  Therefore, it must
> be resolved immediately.  That said, the standard could be clearer...

I was in the impression that "dependent name" means any name whose semantics 
may differ between instantiations [temp.dep]. For "B::type", this is certainly 
true. That is, a construct (such as a name) can be dependent even if 
it's/denotes not a dependent type (by the explicit list of what is and what is 
not a dependent type), and as a result is looked up in the instantiation 

However it seems to me too that since B refers to the current instantiation, 
B::type will not be/denote a dependent type - however i think that does not 
limit lookup to the definition context.

The Standard (draft n3000) says [temp.res]/2 "A name used in a template 
declaration or definition and that is dependent on a template-parameter is 
assumed not to name a type unless the applicable name lookup finds a type name 
or the name is qualified by the keyword typename.". That means, "B::type" is 
dependent and "applicable name lookup" (assuming it means "name lookup in the 
definition context") does not find a type, and so "typename" is needed to mark 
it as a type. 

Not sure whether this is the right analysis though, i find too that the 
Standard could be clearer about that. I recently had a discussion with William 
M. Miller from EDG, who taught me how "dependent name" does not only mean 
"denotes a dependent type", though, but has a much wider range where it 
applies :)

More information about the cfe-commits mailing list