[clang] 849c605 - PR47792: Include the type of a pointer or reference non-type template

Hubert Tong via cfe-commits cfe-commits at lists.llvm.org
Sun Oct 11 18:27:19 PDT 2020


The bots don't seem happy building with a Clang that incorporates this
change:
```
/b/sanitizer-x86_64-linux-bootstrap/build/llvm-project/clang/lib/ASTMatchers/ASTMatchersInternal.cpp:943:5:
error: redefinition of 'hasAnyName' with a different type: 'const
VariadicFunction<...>' vs 'const VariadicFunction<...>'
    hasAnyName = {};
    ^
/b/sanitizer-x86_64-linux-bootstrap/build/llvm-project/clang/include/clang/ASTMatchers/ASTMatchers.h:2771:5:
note: previous declaration is here
    hasAnyName;
    ^
```
(from
http://lab.llvm.org:8011/#/builders/99/builds/49/steps/2/logs/build_clang_asan
)

On Sun, Oct 11, 2020 at 7:00 PM Richard Smith via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

>
> Author: Richard Smith
> Date: 2020-10-11T15:59:49-07:00
> New Revision: 849c60541b630ddf8cabf9179fa771b3f4207ec8
>
> URL:
> https://github.com/llvm/llvm-project/commit/849c60541b630ddf8cabf9179fa771b3f4207ec8
> DIFF:
> https://github.com/llvm/llvm-project/commit/849c60541b630ddf8cabf9179fa771b3f4207ec8.diff
>
> LOG: PR47792: Include the type of a pointer or reference non-type template
> parameter in its notion of template argument identity.
>
> We already did this for all the other kinds of non-type template
> argument. We're still missing the type from the mangling, so we continue
> to be able to see collisions at link time; that's an open ABI issue.
>
> Added:
>
>
> Modified:
>     clang/lib/AST/ASTContext.cpp
>     clang/lib/AST/TemplateBase.cpp
>     clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
> index a82d95461bb9..7c96038629fb 100644
> --- a/clang/lib/AST/ASTContext.cpp
> +++ b/clang/lib/AST/ASTContext.cpp
> @@ -5890,7 +5890,7 @@ ASTContext::getCanonicalTemplateArgument(const
> TemplateArgument &Arg) const {
>
>      case TemplateArgument::Declaration: {
>        auto *D = cast<ValueDecl>(Arg.getAsDecl()->getCanonicalDecl());
> -      return TemplateArgument(D, Arg.getParamTypeForDecl());
> +      return TemplateArgument(D,
> getCanonicalType(Arg.getParamTypeForDecl()));
>      }
>
>      case TemplateArgument::NullPtr:
>
> diff  --git a/clang/lib/AST/TemplateBase.cpp
> b/clang/lib/AST/TemplateBase.cpp
> index a9113720fd45..e4303fdb7731 100644
> --- a/clang/lib/AST/TemplateBase.cpp
> +++ b/clang/lib/AST/TemplateBase.cpp
> @@ -244,7 +244,8 @@ void TemplateArgument::Profile(llvm::FoldingSetNodeID
> &ID,
>      break;
>
>    case Declaration:
> -    ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : nullptr);
> +    ID.AddPointer(getAsDecl() ? getAsDecl()->getCanonicalDecl() :
> nullptr);
> +    getParamTypeForDecl().Profile(ID);
>      break;
>
>    case Template:
> @@ -294,7 +295,8 @@ bool TemplateArgument::structurallyEquals(const
> TemplateArgument &Other) const {
>      return TypeOrValue.V == Other.TypeOrValue.V;
>
>    case Declaration:
> -    return getAsDecl() == Other.getAsDecl();
> +    return getAsDecl() == Other.getAsDecl() &&
> +           getParamTypeForDecl() == Other.getParamTypeForDecl();
>
>    case Integral:
>      return getIntegralType() == Other.getIntegralType() &&
>
> diff  --git a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
> b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
> index 7538de330902..6949a2eaad48 100644
> --- a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
> +++ b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
> @@ -459,3 +459,23 @@ namespace PR46637 {
>    X<f> y;
>    int n = y.call(); // expected-error {{cannot initialize a variable of
> type 'int' with an rvalue of type 'void *'}}
>  }
> +
> +namespace PR47792 {
> +  using I = int;
> +
> +  template<decltype(auto)> int a;
> +  const int n = 0;
> +  const I n2 = 0;
> +  static_assert(&a<n> == &a<0>, "both should have type 'int'");
> +  static_assert(&a<n2> == &a<0>, "both should have type 'int'");
> +
> +  // FIXME: We will need to mangle these cases
> diff erently too!
> +  int m;
> +  const int &r1 = m;
> +  int &r2 = m;
> +  static_assert(&a<r1> != &a<r2>, "should have
> diff erent types");
> +
> +  const I &r3 = m;
> +  static_assert(&a<r1> == &a<r3>, "should have
> diff erent types");
>
I think the text of the static_assert string here is a copy-paste error.


> +  static_assert(&a<r2> != &a<r3>, "should have
> diff erent types");
> +}
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201011/1348af9b/attachment.html>


More information about the cfe-commits mailing list