[clang] 8988fb7 - [clang][ObjC][CodeComplete] Fix crash on C-Style cast with parenthesized operand in ObjC++ (#180343)

via cfe-commits cfe-commits at lists.llvm.org
Sun Feb 15 15:30:08 PST 2026


Author: edisongz
Date: 2026-02-15T15:30:03-08:00
New Revision: 8988fb751669a7e47deb4aa3f3f5fd03ccc95831

URL: https://github.com/llvm/llvm-project/commit/8988fb751669a7e47deb4aa3f3f5fd03ccc95831
DIFF: https://github.com/llvm/llvm-project/commit/8988fb751669a7e47deb4aa3f3f5fd03ccc95831.diff

LOG: [clang][ObjC][CodeComplete] Fix crash on C-Style cast with parenthesized operand in ObjC++ (#180343)

In ObjC++ mode, code-completion after a C-style cast like
`(int*)(0x200)` crashed because the inner parenthesized expression was
parsed as a `ParenListExpr` (null type) due to `AllowTypes` propagation.

Fixes https://github.com/llvm/llvm-project/issues/180125

Added: 
    clang/test/CodeCompletion/objc-cast-parenthesized-expr.m

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Sema/SemaCodeComplete.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index c648e8b0ec6fa..c9bedb87c6a79 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -391,6 +391,9 @@ libclang
 Code Completion
 ---------------
 
+- Fixed a crash in code completion when using a C-Style cast with a parenthesized
+  operand in Objective-C++ mode. (#GH180125)
+
 Static Analyzer
 ---------------
 

diff  --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index aa93507ab5c30..4a3559955ade3 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -8442,6 +8442,11 @@ void SemaCodeCompletion::CodeCompleteObjCInstanceMessage(
   // If necessary, apply function/array conversion to the receiver.
   // C99 6.7.5.3p[7,8].
   if (RecExpr) {
+    // If the receiver expression has no type (e.g., a parenthesized C-style
+    // cast that hasn't been resolved), bail out to avoid dereferencing a null
+    // type.
+    if (RecExpr->getType().isNull())
+      return;
     ExprResult Conv = SemaRef.DefaultFunctionArrayLvalueConversion(RecExpr);
     if (Conv.isInvalid()) // conversion failed. bail.
       return;

diff  --git a/clang/test/CodeCompletion/objc-cast-parenthesized-expr.m b/clang/test/CodeCompletion/objc-cast-parenthesized-expr.m
new file mode 100644
index 0000000000000..171d62cf971f5
--- /dev/null
+++ b/clang/test/CodeCompletion/objc-cast-parenthesized-expr.m
@@ -0,0 +1,12 @@
+// Note: the run lines follow their respective tests, since line/column
+// matter in this test.
+
+void func() {
+  int *foo = (int *)(0x200);
+  int *bar = (int *)((0x200));
+}
+
+// Make sure this doesn't crash
+// RUN: %clang_cc1 -fsyntax-only -xobjective-c++-header -code-completion-at=%s:%(line-5):28 %s
+// RUN: %clang_cc1 -fsyntax-only -xobjective-c++-header -code-completion-at=%s:%(line-5):30 %s
+


        


More information about the cfe-commits mailing list