llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: cor3ntin (cor3ntin) <details> <summary>Changes</summary> 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 --- Full diff: https://github.com/llvm/llvm-project/pull/138245.diff 4 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+2) - (modified) clang/lib/Sema/SemaDecl.cpp (+7-3) - (added) clang/test/CXX/drs/cwg30xx.cpp (+19) - (modified) clang/www/cxx_dr_status.html (+5-1) ``````````diff 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> `````````` </details> https://github.com/llvm/llvm-project/pull/138245 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits