https://github.com/edisongz updated https://github.com/llvm/llvm-project/pull/180343
>From 24e569b3856a2c227603dc01d3a67ae6b3f4490c Mon Sep 17 00:00:00 2001 From: Yijie Jiang <[email protected]> Date: Sat, 7 Feb 2026 18:34:46 +0800 Subject: [PATCH 1/4] [clang][ObjC][CodeComplete] Fix crash on C-Style cast with parenthesized operand in ObjC++ 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. Add a null-type guard in CodeCompletePostfixExpression. --- clang/lib/Sema/SemaCodeComplete.cpp | 2 +- .../CodeCompletion/objc-cast-parenthesized-expr.m | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeCompletion/objc-cast-parenthesized-expr.m diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index aa93507ab5c30..0d8ed56a1ede3 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -5152,7 +5152,7 @@ void SemaCodeCompletion::CodeCompletePostfixExpression(Scope *S, ExprResult E, QualType PreferredType) { if (E.isInvalid()) CodeCompleteExpression(S, PreferredType); - else if (getLangOpts().ObjC) + else if (getLangOpts().ObjC && !E.get()->getType().isNull()) CodeCompleteObjCInstanceMessage(S, E.get(), {}, false); } 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 + >From 46ca8b71c3ddbb0bae8bc4f903b9edfd2c04bbba Mon Sep 17 00:00:00 2001 From: Yijie Jiang <[email protected]> Date: Fri, 13 Feb 2026 19:07:37 +0800 Subject: [PATCH 2/4] [clang] Add ReleaseNotes entry Fixes #180125 --- clang/docs/ReleaseNotes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 613d87668be18..b808459a0c9c4 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -352,6 +352,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 --------------- >From 73d0853d12709fe582affe74146298398c8b72ed Mon Sep 17 00:00:00 2001 From: Yijie Jiang <[email protected]> Date: Sat, 14 Feb 2026 12:28:49 +0800 Subject: [PATCH 3/4] Fix crash on ObjC message send to expr with null type --- clang/lib/Sema/SemaCodeComplete.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 0d8ed56a1ede3..fbf30cb2ff1db 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -5152,7 +5152,7 @@ void SemaCodeCompletion::CodeCompletePostfixExpression(Scope *S, ExprResult E, QualType PreferredType) { if (E.isInvalid()) CodeCompleteExpression(S, PreferredType); - else if (getLangOpts().ObjC && !E.get()->getType().isNull()) + else if (getLangOpts().ObjC) CodeCompleteObjCInstanceMessage(S, E.get(), {}, false); } @@ -8439,6 +8439,11 @@ void SemaCodeCompletion::CodeCompleteObjCInstanceMessage( typedef CodeCompletionResult Result; ASTContext &Context = getASTContext(); + // 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 && RecExpr->getType().isNull()) + return; + // If necessary, apply function/array conversion to the receiver. // C99 6.7.5.3p[7,8]. if (RecExpr) { >From 77b2a79c9086ba5cdfe8d722fa63a3183d7fb316 Mon Sep 17 00:00:00 2001 From: Yijie Jiang <[email protected]> Date: Sat, 14 Feb 2026 13:00:23 +0800 Subject: [PATCH 4/4] Fix crash on ObjC message send to expr with null type --- clang/lib/Sema/SemaCodeComplete.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index fbf30cb2ff1db..4a3559955ade3 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -8439,14 +8439,14 @@ void SemaCodeCompletion::CodeCompleteObjCInstanceMessage( typedef CodeCompletionResult Result; ASTContext &Context = getASTContext(); - // 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 && RecExpr->getType().isNull()) - return; - // 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; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
