[cfe-dev] Adding template default parameter with as typed explicit parameter

Philippe Canal pcanal at fnal.gov
Wed Sep 26 06:10:17 PDT 2012


Hi,

With the class template:

    template <typename T> class Coord;
    template <typename T, typename U = Coord<T> > class Point;

If the user code contains:

    typedef long size_t;
    Point<size_t> p;

when traversing the AST, reaching 'p', I have access to a clang::Type
named 'Point<size_t>' which directs the CXXRecordDecl named
'Point<long, Coord<long> >.

Is there a way to create (from Point<size_t>) a type which would be
named 'Point<size_t, Coord<size_t> >'.  I.e. which preserves the
typedef when expanding/adding the template default parameters?

If there is not, what would you recommend to start from to
implement support for this?

Thanks,
Philippe.

PS.
             clang::TemplateArgumentLoc ArgType = S.SubstDefaultTemplateArgumentIfAvailable(
Template,
TemplateLoc,
RAngleLoc,
                                                              TTP,
Converted);

with Converted containing the argument passed by the user as is (i.e. non-canonical)
**seems** to work as I need it .... but only if a few asserts (requiring the canonicality
of the element of Converted) are removed and if I avoid  the call to:

   } else if (Context.hasSameUnqualifiedType(Arg, Context.OverloadTy)) {
     return Diag(SR.getBegin(), diag::err_template_arg_overload_type) << SR;

in Sema::CheckTemplateArgument which only works properly with canonical types.




More information about the cfe-dev mailing list