[clang] [Clang] Implement CWG3005 Function parameters should never be name-independent (PR #138245)

via cfe-commits cfe-commits at lists.llvm.org
Fri May 2 06:38:12 PDT 2025


https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/138245

>From 63aedb490ecdb251a5005f40e8e1bd3dd2f89e70 Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Fri, 2 May 2025 10:53:38 +0200
Subject: [PATCH 1/2] [Clang] Implement CWG3005 Function parameters should
 never be name-independent.

We already attempted to implement this (it was the intent of the paper),
in that parameters were never considered nmame 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
---
 clang/docs/ReleaseNotes.rst    |  2 ++
 clang/lib/Sema/SemaDecl.cpp    | 10 +++++++---
 clang/test/CXX/drs/cwg30xx.cpp | 19 +++++++++++++++++++
 clang/www/cxx_dr_status.html   |  6 +++++-
 4 files changed, 33 insertions(+), 4 deletions(-)
 create mode 100644 clang/test/CXX/drs/cwg30xx.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index f5cd1fbeabcfe..3d83aeb46ad72 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 46933c5c43168..eb1f2c172c427 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -7532,16 +7532,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..2f65e8b9bebbe
--- /dev/null
+++ b/clang/test/CXX/drs/cwg30xx.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -std=c++98 -pedantic-errors -verify=expected,cxx98 %s
+// RUN: %clang_cc1 -std=c++11 -pedantic-errors -verify=expected,since-cxx11,cxx11-23 %s
+// RUN: %clang_cc1 -std=c++14 -pedantic-errors -verify=expected,since-cxx11,cxx11-23 %s
+// RUN: %clang_cc1 -std=c++17 -pedantic-errors -verify=expected,since-cxx11,cxx11-23 %s
+// RUN: %clang_cc1 -std=c++20 -pedantic-errors -verify=expected,since-cxx11,cxx11-23,since-cxx20 %s
+// RUN: %clang_cc1 -std=c++23 -pedantic-errors -verify=expected,since-cxx11,cxx11-23,since-cxx20,since-cxx23 %s
+// RUN: %clang_cc1 -std=c++2c -pedantic-errors -verify=expected,since-cxx11,since-cxx20,since-cxx23,since-cxx26 %s
+
+
+namespace cwg3005 { // cwg3005: 21 open 2025-03-10
+
+void f(int _, // expected-note  {{previous declaration is here}} \
+              // expected-note  {{previous definition is here}}
+       int _) // expected-error {{redefinition of parameter '_'}}
+{
+    int _; // expected-error {{redefinition of '_'}}
+}
+
+}
diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html
index 8fe53ad46aca9..f8783c6858de1 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>

>From 0d543e2bb40aa8bf94070385eaeffd3687f408ff Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Fri, 2 May 2025 15:37:55 +0200
Subject: [PATCH 2/2] apply feedback

---
 clang/test/CXX/drs/cwg30xx.cpp | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/clang/test/CXX/drs/cwg30xx.cpp b/clang/test/CXX/drs/cwg30xx.cpp
index 2f65e8b9bebbe..a962adadb5c41 100644
--- a/clang/test/CXX/drs/cwg30xx.cpp
+++ b/clang/test/CXX/drs/cwg30xx.cpp
@@ -1,19 +1,23 @@
-// RUN: %clang_cc1 -std=c++98 -pedantic-errors -verify=expected,cxx98 %s
-// RUN: %clang_cc1 -std=c++11 -pedantic-errors -verify=expected,since-cxx11,cxx11-23 %s
-// RUN: %clang_cc1 -std=c++14 -pedantic-errors -verify=expected,since-cxx11,cxx11-23 %s
-// RUN: %clang_cc1 -std=c++17 -pedantic-errors -verify=expected,since-cxx11,cxx11-23 %s
-// RUN: %clang_cc1 -std=c++20 -pedantic-errors -verify=expected,since-cxx11,cxx11-23,since-cxx20 %s
-// RUN: %clang_cc1 -std=c++23 -pedantic-errors -verify=expected,since-cxx11,cxx11-23,since-cxx20,since-cxx23 %s
-// RUN: %clang_cc1 -std=c++2c -pedantic-errors -verify=expected,since-cxx11,since-cxx20,since-cxx23,since-cxx26 %s
+// 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 _, // expected-note  {{previous declaration is here}} \
-              // expected-note  {{previous definition is here}}
-       int _) // expected-error {{redefinition of parameter '_'}}
+void f(
+    int _, // #cwg3005-first-param
+    int _)
+    // expected-error at -1 {{redefinition of parameter '_'}}
+    //   expected-note@#cwg3005-first-param {{previous declaration is here}}
 {
-    int _; // expected-error {{redefinition of '_'}}
+    int _;
+    // expected-error at -1 {{redefinition of '_'}}
+    // expected-note@#cwg3005-first-param {{previous declaration is here}}
 }
 
-}
+} // namespace cwg3005



More information about the cfe-commits mailing list