switch (NPV) {
case NPV_NullPointer:
S.Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
- Converted = TemplateArgument(ParamType, /*isNullPtr=*/true);
+ Converted = TemplateArgument(S.Context.getCanonicalType(ParamType),
+ /*isNullPtr=*/true);
return false;
case NPV_Error:
return true;
case NPV_NullPointer:
S.Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
- Converted = TemplateArgument(ParamType, /*isNullPtr*/true);
+ Converted = TemplateArgument(S.Context.getCanonicalType(ParamType),
+ /*isNullPtr*/true);
if (S.Context.getTargetInfo().getCXXABI().isMicrosoft())
S.RequireCompleteType(Arg->getExprLoc(), ParamType, 0);
return false;
case NPV_NullPointer:
Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
- Converted = TemplateArgument(ParamType, /*isNullPtr*/true);
+ Converted = TemplateArgument(Context.getCanonicalType(ParamType),
+ /*isNullPtr*/true);
return Arg;
}
}
f<int[3], int*, nullptr>(); // expected-note{{in instantiation of}}
}
}
+
+namespace CanonicalNullptr {
+ template<typename T> struct get { typedef T type; };
+ struct X {};
+ template<typename T, typename get<T *>::type P = nullptr> struct A {};
+ template<typename T, typename get<decltype((T(), nullptr))>::type P = nullptr> struct B {};
+ template<typename T, typename get<T X::*>::type P = nullptr> struct C {};
+
+ template<typename T> A<T> MakeA();
+ template<typename T> B<T> MakeB();
+ template<typename T> C<T> MakeC();
+ A<int> a = MakeA<int>();
+ B<int> b = MakeB<int>();
+ C<int> c = MakeC<int>();
+}