[Clang] Fix compat diagnostic to detect a nontype template parameter has a placeholder type using getContainedAutoType()

Based on the changes introduced by 15361a21e0 it
looks like C++17 compatibility diagnostic should have been checking
getContainedAutoType().

This fixes: https://github.com/llvm/llvm-project/issues/57369
  https://github.com/llvm/llvm-project/issues/57643
  https://github.com/llvm/llvm-project/issues/57793

Differential Revision: https://reviews.llvm.org/D132990
This commit is contained in:
Shafik Yaghmour 2022-09-18 11:54:32 -07:00
parent d6498abc24
commit f8a37a6ce6
4 changed files with 27 additions and 5 deletions

View File

@ -146,6 +146,11 @@ Bug Fixes
- A SubstTemplateTypeParmType can now represent the pack index for a
substitution from an expanded pack.
`Issue 56099 <https://github.com/llvm/llvm-project/issues/56099>`_
- Fix `-Wpre-c++17-compat` crashing Clang when compiling C++20 code which
contains deduced template specializations. This Fixes
`Issue 57369 <https://github.com/llvm/llvm-project/issues/57369>`_
`Issue 57643 <https://github.com/llvm/llvm-project/issues/57643>`_
`Issue 57793 <https://github.com/llvm/llvm-project/issues/57793>`_
Improvements to Clang's diagnostics

View File

@ -1531,11 +1531,11 @@ NamedDecl *Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D,
CheckValidDeclSpecifiers();
if (TInfo->getType()->isUndeducedType()) {
Diag(D.getIdentifierLoc(),
diag::warn_cxx14_compat_template_nontype_parm_auto_type)
<< QualType(TInfo->getType()->getContainedAutoType(), 0);
}
if (const auto *T = TInfo->getType()->getContainedDeducedType())
if (isa<AutoType>(T))
Diag(D.getIdentifierLoc(),
diag::warn_cxx14_compat_template_nontype_parm_auto_type)
<< QualType(TInfo->getType()->getContainedAutoType(), 0);
assert(S->isTemplateParamScope() &&
"Non-type template parameter not in template parameter scope!");

View File

@ -0,0 +1,10 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 -Wpre-c++17-compat %s
// expected-no-diagnostics
namespace GH57362 {
template <int num>
class TemplateClass {};
template <TemplateClass nttp> // ok, no diagnostic expected
void func() {}
}

View File

@ -0,0 +1,7 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 -Wpre-c++17-compat %s
template <decltype(auto) n> // expected-warning {{non-type template parameters declared with 'decltype(auto)' are incompatible with C++ standards before C++17}}
struct B{};
template <auto n> // expected-warning {{non-type template parameters declared with 'auto' are incompatible with C++ standards before C++17}}
struct A{};