[clang] 267a437 - [Clang][Sema] Skip RecordDecl when checking scope of declarations (#69432)

via cfe-commits cfe-commits at lists.llvm.org
Sun Nov 5 19:54:54 PST 2023


Author: Qiu Chaofan
Date: 2023-11-06T11:54:51+08:00
New Revision: 267a437920904723360cb2837172bd776db73057

URL: https://github.com/llvm/llvm-project/commit/267a437920904723360cb2837172bd776db73057
DIFF: https://github.com/llvm/llvm-project/commit/267a437920904723360cb2837172bd776db73057.diff

LOG: [Clang][Sema] Skip RecordDecl when checking scope of declarations (#69432)

In non C++ mode, struct definitions does not create a scope for
declaration.

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Sema/IdentifierResolver.cpp
    clang/test/Sema/nested-redef.c
    clang/test/SemaObjC/ivar-lookup.m

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 3edf480665ba10c..5e19dbea6608486 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -712,6 +712,8 @@ Miscellaneous Clang Crashes Fixed
   `Issue 64564 <https://github.com/llvm/llvm-project/issues/64564>`_
 - Fixed a crash when an ObjC ivar has an invalid type. See
   (`#68001 <https://github.com/llvm/llvm-project/pull/68001>`_)
+- Fixed a crash in C when redefined struct is another nested redefinition.
+  `Issue 41302 <https://github.com/llvm/llvm-project/issues/41302>`_
 
 Target Specific Changes
 -----------------------

diff  --git a/clang/lib/Sema/IdentifierResolver.cpp b/clang/lib/Sema/IdentifierResolver.cpp
index 98a6f3b45089b3a..2213c3c837243ad 100644
--- a/clang/lib/Sema/IdentifierResolver.cpp
+++ b/clang/lib/Sema/IdentifierResolver.cpp
@@ -109,7 +109,9 @@ bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S,
     return false;
   if (Ctx->isFunctionOrMethod() || (S && S->isFunctionPrototypeScope())) {
     // Ignore the scopes associated within transparent declaration contexts.
-    while (S->getEntity() && S->getEntity()->isTransparentContext())
+    while (S->getEntity() &&
+           (S->getEntity()->isTransparentContext() ||
+            (!LangOpt.CPlusPlus && isa<RecordDecl>(S->getEntity()))))
       S = S->getParent();
 
     if (S->isDeclScope(D))

diff  --git a/clang/test/Sema/nested-redef.c b/clang/test/Sema/nested-redef.c
index bbc485936770478..adc57ff4e04ab29 100644
--- a/clang/test/Sema/nested-redef.c
+++ b/clang/test/Sema/nested-redef.c
@@ -19,4 +19,16 @@ void f2(void) {
   struct U u;
 }
 
+void f3(void) {
+  struct G { // expected-note{{previous definition is here}}
+    struct G {}; // expected-error{{nested redefinition of 'G'}}
+  };
+}
+
+void f4(void) {
+  struct G { // expected-note 2{{previous definition is here}}
+    struct G {}; // expected-error{{nested redefinition of 'G'}}
+  };
 
+  struct G {}; // expected-error{{redefinition of 'G'}}
+}

diff  --git a/clang/test/SemaObjC/ivar-lookup.m b/clang/test/SemaObjC/ivar-lookup.m
index 898ffac99692ced..d88299e58e0f594 100644
--- a/clang/test/SemaObjC/ivar-lookup.m
+++ b/clang/test/SemaObjC/ivar-lookup.m
@@ -95,11 +95,11 @@ - (int) test
   union U {
     __typeof(myStatus) __in;  // fails.
   };
-  struct S {
+  struct S { // expected-note{{previous definition is here}}
     __typeof(myStatus) __in;  // fails.
     struct S1 { // expected-warning {{declaration does not declare anything}}
       __typeof(myStatus) __in;  // fails.
-      struct S { // expected-warning {{declaration does not declare anything}}
+      struct S { // expected-error {{nested redefinition of 'S'}}
         __typeof(myStatus) __in;  // fails.
       };
     };


        


More information about the cfe-commits mailing list