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 <corentinja...@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 <corentinja...@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@-1 {{redefinition of parameter '_'}} + // expected-note@#cwg3005-first-param {{previous declaration is here}} { - int _; // expected-error {{redefinition of '_'}} + int _; + // expected-error@-1 {{redefinition of '_'}} + // expected-note@#cwg3005-first-param {{previous declaration is here}} } -} +} // namespace cwg3005 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits