[clang] 9c06937 - Reland "[Clang][Sema] Fix invalid redefinition error in if/switch/for statement"

Jun Zhang via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 20 10:19:08 PDT 2022


Author: Jun Zhang
Date: 2022-04-21T01:18:58+08:00
New Revision: 9c069374cebe0162bc4f0b9d0397cf2b1c5febf6

URL: https://github.com/llvm/llvm-project/commit/9c069374cebe0162bc4f0b9d0397cf2b1c5febf6
DIFF: https://github.com/llvm/llvm-project/commit/9c069374cebe0162bc4f0b9d0397cf2b1c5febf6.diff

LOG: Reland "[Clang][Sema] Fix invalid redefinition error in if/switch/for statement"

This reverts commit 9f075c3d84fb359efb6496535ab397a6f09609e2.
The broken build has alreasy been fixed in D124012, so reland it now.
Signed-off-by: Jun Zhang <jun at junz.org>

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Sema/IdentifierResolver.cpp
    clang/test/SemaCXX/cxx1z-init-statement.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 03561fe2150aa..fb81e9db5691e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -119,6 +119,10 @@ Bug Fixes
   This fixes Issue `Issue 52802 <https://github.com/llvm/llvm-project/issues/52802>`_.
 - Unknown type attributes with a ``[[]]`` spelling are no longer diagnosed twice.
   This fixes Issue `Issue 54817 <https://github.com/llvm/llvm-project/issues/54817>`_.
+- Clang should no longer incorrectly diagnose a variable declaration inside of
+  a lambda expression that shares the name of a variable in a containing
+  if/while/for/switch init statement as a redeclaration.
+  This fixes `Issue 54913 <https://github.com/llvm/llvm-project/issues/54913>`_.
 
 Improvements to Clang's diagnostics
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

diff  --git a/clang/lib/Sema/IdentifierResolver.cpp b/clang/lib/Sema/IdentifierResolver.cpp
index cef1ae890e6cb..9081714c893f5 100644
--- a/clang/lib/Sema/IdentifierResolver.cpp
+++ b/clang/lib/Sema/IdentifierResolver.cpp
@@ -123,7 +123,7 @@ bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S,
       assert(S->getParent() && "No TUScope?");
       // If the current decl is in a lambda, we shouldn't consider this is a
       // redefinition as lambda has its own scope.
-      if (S->getParent()->isControlScope()) {
+      if (S->getParent()->isControlScope() && !S->isFunctionScope()) {
         S = S->getParent();
         if (S->isDeclScope(D))
           return true;

diff  --git a/clang/test/SemaCXX/cxx1z-init-statement.cpp b/clang/test/SemaCXX/cxx1z-init-statement.cpp
index eea2589ab7c62..b963c9eabe79b 100644
--- a/clang/test/SemaCXX/cxx1z-init-statement.cpp
+++ b/clang/test/SemaCXX/cxx1z-init-statement.cpp
@@ -90,3 +90,18 @@ void test_constexpr_init_stmt() {
   static_assert(constexpr_switch_init(-2) == 0, "");
   static_assert(constexpr_switch_init(-5) == -1, "");
 }
+
+int test_lambda_init() {
+  if (int x = []() {int x = 42; return x; }(); x) {
+  };
+
+  switch (int y = []() {int y = 42; return y; }(); y) {
+  case 42:
+    return 1;
+  }
+
+  for (int x = [] { int x = 0; return x; }();;)
+    ;
+
+  return 0;
+}


        


More information about the cfe-commits mailing list