Expand definition deprecation warning to include constexpr statements.

Clang currently warns on definitions downgraded to declarations
with a const modifier, but not for a constexpr modifier. This patch
updates the warning logic to warn on both inputs, and adds a test to
check the additional case as well.

See also: https://bugs.chromium.org/p/chromium/issues/detail?id=1284718

Differential Revision: https://reviews.llvm.org/D126664
This commit is contained in:
Luke Nihlen 2022-06-01 11:29:48 -04:00 committed by Aaron Ballman
parent aeb27f133a
commit 1f6ea2a37c
3 changed files with 12 additions and 4 deletions

View File

@ -241,6 +241,9 @@ Improvements to Clang's diagnostics
suggest ``#else`` as an alternative. ``#elifdef`` and ``#elifndef`` are only
suggested when in C2x or C++2b mode. Fixes
`Issue 51598 <https://github.com/llvm/llvm-project/issues/51598>`_.
- The ``-Wdeprecated`` diagnostic will now warn on out-of-line ``constexpr``
declarations downgraded to definitions in C++1z, in addition to the
existing warning on out-of-line ``const`` declarations.
Non-comprehensive list of changes in this release
-------------------------------------------------

View File

@ -4508,15 +4508,15 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {
}
// C++ doesn't have tentative definitions, so go right ahead and check here.
if (getLangOpts().CPlusPlus &&
New->isThisDeclarationADefinition() == VarDecl::Definition) {
if (getLangOpts().CPlusPlus) {
if (Old->isStaticDataMember() && Old->getCanonicalDecl()->isInline() &&
Old->getCanonicalDecl()->isConstexpr()) {
// This definition won't be a definition any more once it's been merged.
Diag(New->getLocation(),
diag::warn_deprecated_redundant_constexpr_static_def);
} else if (VarDecl *Def = Old->getDefinition()) {
if (checkVarDeclRedefinition(Def, New))
} else if (New->isThisDeclarationADefinition() == VarDecl::Definition) {
VarDecl *Def = Old->getDefinition();
if (Def && checkVarDeclRedefinition(Def, New))
return;
}
}

View File

@ -5,4 +5,9 @@ namespace {
static constexpr int n = 0;
};
const int A::n; // expected-warning {{deprecated}}
struct B {
static constexpr int m = 0;
};
constexpr int B::m; // expected-warning {{deprecated}}
}