[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