[clang] [clang] Avoid invalid recovery cast for non-pointer Class redefinitions (PR #213590)
Gauarv Chaudhary via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 2 23:57:46 PDT 2026
https://github.com/ANAMASGARD updated https://github.com/llvm/llvm-project/pull/213590
>From 0237bc2c44324d3ae4f02e8c8992b96c6d1e2bbd Mon Sep 17 00:00:00 2001
From: Gaurav Chaudhary <chaudharygaurav2004 at gmail.com>
Date: Mon, 3 Aug 2026 10:17:56 +0530
Subject: [PATCH] [clang] Avoid invalid recovery cast for non-pointer Class
redefinitions
ShouldTryAgainWithRedefinitionType() can attempt to recover builtin Objective-C id/
Class member access using a user-written non-pointer redefinition. This constructs a
CK_BitCast between incompatible type categories and violates CastExpr's AST invariants.
Reject non-pointer redefinition types before attempting the recovery cast, while preserving
recovery for C and Objective-C object pointers.
Fixes #213066
Signed-off-by: Gaurav Chaudhary <chaudharygaurav2004 at gmail.com>
---
clang/lib/Sema/SemaExprMember.cpp | 5 +++++
clang/test/SemaObjCXX/gh213066.mm | 9 +++++++++
2 files changed, 14 insertions(+)
create mode 100644 clang/test/SemaObjCXX/gh213066.mm
diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp
index 62ecc52c0374b..f42b94c216660 100644
--- a/clang/lib/Sema/SemaExprMember.cpp
+++ b/clang/lib/Sema/SemaExprMember.cpp
@@ -1188,6 +1188,11 @@ static bool ShouldTryAgainWithRedefinitionType(Sema &S, ExprResult &base) {
return false;
}
+ // Only retry with pointer redefinition types, since a non-pointer
+ // destination would produce an invalid CK_BitCast.
+ if (!redef->isAnyPointerType())
+ return false;
+
// Do the substitution as long as the redefinition type isn't just a
// possibly-qualified pointer to builtin-id or builtin-Class again.
opty = redef->getAs<ObjCObjectPointerType>();
diff --git a/clang/test/SemaObjCXX/gh213066.mm b/clang/test/SemaObjCXX/gh213066.mm
new file mode 100644
index 0000000000000..58123a3640a4a
--- /dev/null
+++ b/clang/test/SemaObjCXX/gh213066.mm
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -triple x86_64-apple-macosx -fsyntax-only -verify -x objective-c++ %s
+// REQUIRES: asserts
+
+typedef struct {} Class;
+
+void test() {
+ Class c;
+ c.className; // expected-error {{member reference base type 'Class' is not a structure or union}}
+}
More information about the cfe-commits
mailing list