On Mon, Jun 25, 2012 at 7:47 PM, Richard Trieu <[email protected]> wrote:
> On Mon, Jun 25, 2012 at 2:09 PM, Richard Trieu <[email protected]> wrote: > >> On Sun, Jun 24, 2012 at 2:57 PM, Richard Smith <[email protected]>wrote: >> >>> Thanks, LGTM. >>> >>> >>> Incidentally, for this example: >>> >>> >>> template<typename ...T> struct S {}; >>> template<typename T> using U = S<int, char, T>; >>> template<typename T> using V = U<U<T>>; >>> int f(S<int, char, U<const double>>); >>> int k = f(V<double>()); >>> >>> I get: >>> >>> <stdin>:4:5: note: candidate function not viable: no known conversion >>> from 'S<[2 >>> * ...], *struct S<int, char, double>*>' to 'S<[2 * ...], *U<const >>> double>*>' for 1st argument; >>> >>> where I would have preferred: >>> >>> <stdin>:4:5: note: candidate function not viable: no known conversion >>> from 'S<[2 >>> * ...], S<[2 * ...], *double*>>' to 'S<[2 * ...], S<[2 * ...], * >>> const >>> double*>>' for 1st argument; >>> >>> Any idea what's going on there? >>> >>> >>> Looking into it. It looks like Clang has 'struct S<int, char, double>' >> as a SubstTemplateTypeParmType instead of a TemplateSpecializationType, >> causing the template diffing to handle it as a type without going deeper. >> > > Fixed. > > + static const TemplateSpecializationType * GetTemplateSpecializationType( Extra space after *. > + if (const SubstTemplateTypeParmType *STTPT = > + Ty->getAs<SubstTemplateTypeParmType>()) > + Ty = STTPT->getReplacementType(); Is this necessary? Since you next do this: > + > + const RecordType *RT = Ty->getAs<RecordType>(); ... I would expect the STTPT desugaring to be covered by the getAs<RecordType>. Seems fine otherwise. Thanks!
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
