// Simple case: not a parameter pack.
assert(FParamIdx < Function->getNumParams());
ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx);
+ // If the parameter's type is not dependent, update it to match the type
+ // in the pattern. They can differ in top-level cv-qualifiers, and we want
+ // the pattern's type here. If the type is dependent, they can't differ,
+ // per core issue 1668.
+ // FIXME: Updating the type to work around this is at best fragile.
+ if (!PatternDecl->getType()->isDependentType())
+ FunctionParam->setType(PatternParam->getType());
+
FunctionParam->setDeclName(PatternParam->getDeclName());
Scope.InstantiatedLocal(PatternParam, FunctionParam);
++FParamIdx;
"should only be called when all template arguments are known");
for (unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx);
+ if (!PatternDecl->getType()->isDependentType())
+ FunctionParam->setType(PatternParam->getType());
+
FunctionParam->setDeclName(PatternParam->getDeclName());
Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam);
++FParamIdx;
template <typename T>
T TemplateClass2<T>::member[TemplateClass2<T>::SIZE];
}
+
+namespace PR18275 {
+ template<typename T> struct A {
+ void f(const int);
+ void g(int);
+ void h(const T);
+ void i(T);
+ };
+
+ template<typename T>
+ void A<T>::f(int x) { x = 0; }
+
+ template<typename T>
+ void A<T>::g(const int x) { x = 0; } // expected-error {{not assignable}}
+
+ template<typename T>
+ void A<T>::h(T) {} // FIXME: Should reject this. Type is different from prior decl if T is an array type.
+
+ template<typename T>
+ void A<T>::i(const T) {} // FIXME: Should reject this. Type is different from prior decl if T is an array type.
+
+ template struct A<int>;
+ template struct A<int[1]>;
+}