[cfe-dev] QualifiedNameType generated for a dependent type name.

Douglas Gregor dgregor at apple.com
Thu Apr 29 09:16:02 PDT 2010

On Apr 29, 2010, at 2:02 AM, Enea Zaffanella <zaffanella at cs.unipr.it> wrote:

> Hello.
> It seems that clang (r102496) sometimes generates a QualifiedNameType 
> (which is meant to be a non-dependent type) when a DependentNameType 
> should be expected.
> Consider the following program fragment:
> =================
> template <typename T>
> struct S {
>   class Inner {};
>   Inner a_method();
> };
> template <typename T>
> typename S<T>::Inner a_function();
> template <typename T>
> typename S<T>::Inner
> S<T>::a_method() {}
> =================
> Both return types for a_function() and a_method() are type dependent, 
> hence they should be encoded by a DependentNameType. However, it seems 
> that a QualifiedNameType is generated for a_method().

The name DependentNameType is slightly misleading. It represents dependent types that refer to a member of an unknown specialization, meaning that we can't resolve them to an actual type until we instantiate. With the example you've given, we know that Inner is a member of the current instantiation, so it is correct to use QualifiedNameType. 

> I don't know how to obtain a detailed description of the AST produced by 
> clang ... since AST type nodes seems to be just printed rather than 
> dumped. Anyway, even with the -ast-print option, it can be seen that the 
> out-of-line definition of a_method() is missing the "typename" keyword.

Right. We don't keep track of whether typename was written in the QualifiedNameType, but we should. 

> $ llvm/Debug/bin/clang++ -cc1 -ast-print bug.cc
> [...]
> template <typename T> typename S<T>::Inner a_function();
> S<T>::Inner a_method() {
> }
> Regards,
> Enea Zaffanella.
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

More information about the cfe-dev mailing list