r213834 - Take the canonical type when forming a canonical template argument with

Richard Smith richard at metafoo.co.uk
Wed Jul 23 19:40:04 PDT 2014


Bill, this is a good candidate for the 3.5 branch.


On Wed, Jul 23, 2014 at 7:27 PM, Richard Smith <richard-llvm at metafoo.co.uk>
wrote:

> Author: rsmith
> Date: Wed Jul 23 21:27:39 2014
> New Revision: 213834
>
> URL: http://llvm.org/viewvc/llvm-project?rev=213834&view=rev
> Log:
> Take the canonical type when forming a canonical template argument with
> 'nullptr' value. Fixes profiling of such template arguments to always give
> the
> same value.
>
> Modified:
>     cfe/trunk/lib/Sema/SemaTemplate.cpp
>     cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=213834&r1=213833&r2=213834&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Jul 23 21:27:39 2014
> @@ -4438,7 +4438,8 @@ CheckTemplateArgumentAddressOfObjectOrFu
>      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:
> @@ -4633,7 +4634,8 @@ static bool CheckTemplateArgumentPointer
>      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;
> @@ -5089,7 +5091,8 @@ ExprResult Sema::CheckTemplateArgument(N
>
>      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;
>      }
>    }
>
> Modified: cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp?rev=213834&r1=213833&r2=213834&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp (original)
> +++ cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Wed Jul 23
> 21:27:39 2014
> @@ -8,3 +8,18 @@ namespace PR15360 {
>      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>();
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140723/3e3e1460/attachment.html>


More information about the cfe-commits mailing list