[clang] 1101b76 - [Clang] Implement CWG3005 Function parameters should never be name-independent (#138245)
via cfe-commits
cfe-commits at lists.llvm.org
Fri May 2 11:56:31 PDT 2025
Author: cor3ntin
Date: 2025-05-02T20:56:28+02:00
New Revision: 1101b767329dd163d528fa5f667a6c0dbdde0ad5
URL: https://github.com/llvm/llvm-project/commit/1101b767329dd163d528fa5f667a6c0dbdde0ad5
DIFF: https://github.com/llvm/llvm-project/commit/1101b767329dd163d528fa5f667a6c0dbdde0ad5.diff
LOG: [Clang] Implement CWG3005 Function parameters should never be name-independent (#138245)
We already attempted to implement this (it was the intent of the paper),
in that parameters were never considered name-independent. However, we
failed to check that any previously found parameter declaration was also
name-independent.
Note that, as worded, the current resolution is insufficient (I wrote to
CWG with better wording), but there is some consensus on the design
outcome.
Fixes #136373
Added:
clang/test/CXX/drs/cwg30xx.cpp
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaDecl.cpp
clang/www/cxx_dr_status.html
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 792ef88b5c87d..4bd9d904e1ea9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -134,6 +134,8 @@ Resolutions to C++ Defect Reports
- Bumped the ``__cpp_constexpr`` feature-test macro to ``202002L`` in C++20 mode as indicated in
`P2493R0 <https://wg21.link/P2493R0>`_.
+- Implemented `CWG3005 Function parameters should never be name-independent <https://wg21.link/CWG3005>`_.
+
C Language Changes
------------------
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 67ff3f055ca5a..63937ddc3e386 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -7542,16 +7542,20 @@ NamedDecl *Sema::ActOnVariableDeclarator(
DeclSpec::SCS SCSpec = D.getDeclSpec().getStorageClassSpec();
StorageClass SC = StorageClassSpecToVarDeclStorageClass(D.getDeclSpec());
-
if (LangOpts.CPlusPlus && (DC->isClosure() || DC->isFunctionOrMethod()) &&
SC != SC_Static && SC != SC_Extern && II && II->isPlaceholder()) {
+
IsPlaceholderVariable = true;
+
if (!Previous.empty()) {
NamedDecl *PrevDecl = *Previous.begin();
bool SameDC = PrevDecl->getDeclContext()->getRedeclContext()->Equals(
DC->getRedeclContext());
- if (SameDC && isDeclInScope(PrevDecl, CurContext, S, false))
- DiagPlaceholderVariableDefinition(D.getIdentifierLoc());
+ if (SameDC && isDeclInScope(PrevDecl, CurContext, S, false)) {
+ IsPlaceholderVariable = !isa<ParmVarDecl>(PrevDecl);
+ if (IsPlaceholderVariable)
+ DiagPlaceholderVariableDefinition(D.getIdentifierLoc());
+ }
}
}
diff --git a/clang/test/CXX/drs/cwg30xx.cpp b/clang/test/CXX/drs/cwg30xx.cpp
new file mode 100644
index 0000000000000..a0e13013b1bbf
--- /dev/null
+++ b/clang/test/CXX/drs/cwg30xx.cpp
@@ -0,0 +1,23 @@
+// RUN: %clang_cc1 -std=c++98 -pedantic-errors -verify=expected %s
+// RUN: %clang_cc1 -std=c++11 -pedantic-errors -verify=expected %s
+// RUN: %clang_cc1 -std=c++14 -pedantic-errors -verify=expected %s
+// RUN: %clang_cc1 -std=c++17 -pedantic-errors -verify=expected %s
+// RUN: %clang_cc1 -std=c++20 -pedantic-errors -verify=expected %s
+// RUN: %clang_cc1 -std=c++23 -pedantic-errors -verify=expected %s
+// RUN: %clang_cc1 -std=c++2c -pedantic-errors -verify=expected %s
+
+
+namespace cwg3005 { // cwg3005: 21 open 2025-03-10
+
+void f(
+ int _, // #cwg3005-first-param
+ int _)
+ // expected-error at -1 {{redefinition of parameter '_'}}
+ // expected-note@#cwg3005-first-param {{previous definition is here}}
+{
+ int _;
+ // expected-error at -1 {{redefinition of '_'}}
+ // expected-note@#cwg3005-first-param {{previous declaration is here}}
+}
+
+} // namespace cwg3005
diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html
index 421c189cfe1f4..52c9cb7d37c23 100755
--- a/clang/www/cxx_dr_status.html
+++ b/clang/www/cxx_dr_status.html
@@ -17890,7 +17890,11 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/3005.html">3005</a></td>
<td>open</td>
<td>Function parameters should never be name-independent</td>
- <td align="center">Not resolved</td>
+ <td align="center">
+ <details>
+ <summary>Not resolved</summary>
+ Clang 21 implements 2025-03-10 resolution
+ </details></td>
</tr>
<tr class="open" id="3006">
<td><a href="https://cplusplus.github.io/CWG/issues/3006.html">3006</a></td>
More information about the cfe-commits
mailing list