================
Comment at: include/clang/AST/Type.h:3453-3460
@@ -3451,8 +3452,10 @@
 
-  SubstTemplateTypeParmType(const TemplateTypeParmType *Param, QualType Canon)
-    : Type(SubstTemplateTypeParm, Canon, Canon->isDependentType(),
-           Canon->isInstantiationDependentType(),
-           Canon->isVariablyModifiedType(),
-           Canon->containsUnexpandedParameterPack()),
-      Replaced(Param) { }
+  SubstTemplateTypeParmType(const TemplateTypeParmType *Param,
+                            QualType Replacement)
+    : Type(SubstTemplateTypeParm, Replacement.getCanonicalType(),
+           Replacement->isDependentType(),
+           Replacement->isInstantiationDependentType(),
+           Replacement->isVariablyModifiedType(),
+           Replacement->containsUnexpandedParameterPack()),
+      Replaced(Param), ReplacementType(Replacement) { }
 
----------------
How does this deal with templates which are instantiated multiple times with 
equivalent, but differently-sugared, types? For instance:

template<typename T> struct A { T val; };
typedef int T1;
A<T1> a;
typedef int T2;
char &r = A<T2>().val;

... does this produce a message about T1?

I think for this case we still want to substitute the canonical type into the 
template, and recover sugar based on the context of use.


http://llvm-reviews.chandlerc.com/D562
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to