Skip to content

Commit

Permalink
[clang] Improve diagnostic for reopened inline namespace
Browse files Browse the repository at this point in the history
Reviewed By: cor3ntin, aaron.ballman

Differential Revision: https://reviews.llvm.org/D122278
  • Loading branch information
FabianWolff committed Mar 23, 2022
1 parent fc3cdd0 commit 528e6eb
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 2 deletions.
5 changes: 5 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ Improvements to Clang's diagnostics
- ``-Wliteral-range`` will warn on floating-point equality comparisons with
constants that are not representable in a casted value. For example,
``(float) f == 0.1`` is always false.
- ``-Winline-namespace-reopened-noninline`` now takes into account that the
``inline`` keyword must appear on the original but not necessarily all
extension definitions of an inline namespace and therefore points its note
at the original definition. This fixes `Issue 50794 (PR51452)
<https://github.com/llvm/llvm-project/issues/50794>`_.

Non-comprehensive list of changes in this release
-------------------------------------------------
Expand Down
5 changes: 5 additions & 0 deletions clang/lib/Sema/SemaDeclCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11060,6 +11060,11 @@ static void DiagnoseNamespaceInlineMismatch(Sema &S, SourceLocation KeywordLoc,
NamespaceDecl *PrevNS) {
assert(*IsInline != PrevNS->isInline());

// 'inline' must appear on the original definition, but not necessarily
// on all extension definitions, so the note should point to the first
// definition to avoid confusion.
PrevNS = PrevNS->getFirstDecl();

if (PrevNS->isInline())
// The user probably just forgot the 'inline', so suggest that it
// be added back.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ inline namespace foo4::foo5::foo6 { // expected-error {{nested namespace definit
// expected-warning@+2 {{inline nested namespace definition is incompatible with C++ standards before C++20}}
#endif
namespace valid1::valid2::inline valid3::inline valid4::valid5 {}
// expected-note@-1 2 {{previous definition is here}}
// expected-note@-1 4 {{previous definition is here}}

#if __cplusplus <= 201402L
// expected-warning@+3 {{nested namespace definition is a C++17 extension; define each namespace separately}}
Expand All @@ -34,7 +34,6 @@ namespace valid1::valid2::valid3::valid4::valid5 {}
// expected-warning@+2 {{inline nested namespace definition is incompatible with C++ standards before C++20}}
#endif
namespace valid1::valid2::inline valid3::inline valid4::valid5 {}
// expected-note@-1 2 {{previous definition is here}}

namespace valid1 {
namespace valid2 {
Expand Down
9 changes: 9 additions & 0 deletions clang/test/SemaCXX/warn-inline-namespace-reopened-twice.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// RUN: %clang_cc1 -fsyntax-only -Wall -verify -std=c++11 %s

// Regression test for #50794.

// expected-note@+1 2 {{previous definition is here}}
inline namespace X {}

namespace X {} // expected-warning {{inline namespace reopened as a non-inline namespace}}
namespace X {} // expected-warning {{inline namespace reopened as a non-inline namespace}}

0 comments on commit 528e6eb

Please sign in to comment.