[clang] 498c7fa - [SemaObjC] Fix a crash on an invalid ternary with ARC pointers

Erik Pilkington via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 13 18:20:41 PDT 2020


Author: Erik Pilkington
Date: 2020-10-13T21:20:20-04:00
New Revision: 498c7fa48a02a5e0c12bbb90ef8c0d8468affcdd

URL: https://github.com/llvm/llvm-project/commit/498c7fa48a02a5e0c12bbb90ef8c0d8468affcdd
DIFF: https://github.com/llvm/llvm-project/commit/498c7fa48a02a5e0c12bbb90ef8c0d8468affcdd.diff

LOG: [SemaObjC] Fix a crash on an invalid ternary with ARC pointers

FindCompositeObjCPointerType nulls out the subexpressions on error, so bail out
instead of trying to deref them.

Added: 
    

Modified: 
    clang/lib/Sema/SemaExprCXX.cpp
    clang/test/SemaObjCXX/arc-type-conversion.mm

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index ed57772cd237..d39820fb483d 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -6325,6 +6325,8 @@ QualType Sema::CXXCheckConditionalOperands(ExprResult &Cond, ExprResult &LHS,
 
   // Similarly, attempt to find composite type of two objective-c pointers.
   Composite = FindCompositeObjCPointerType(LHS, RHS, QuestionLoc);
+  if (LHS.isInvalid() || RHS.isInvalid())
+    return QualType();
   if (!Composite.isNull())
     return Composite;
 

diff  --git a/clang/test/SemaObjCXX/arc-type-conversion.mm b/clang/test/SemaObjCXX/arc-type-conversion.mm
index 1e3790bfa472..e8580cf685b4 100644
--- a/clang/test/SemaObjCXX/arc-type-conversion.mm
+++ b/clang/test/SemaObjCXX/arc-type-conversion.mm
@@ -216,3 +216,10 @@ void ownership_transfer_in_cast(void *vp, Block *pblk) {
 
 // Make sure we don't crash.
 void writeback_test(NSString & &) {} // expected-error {{type name declared as a reference to a reference}}
+
+void test_strong_opaque() {
+  __strong NSString *sptr;
+  void *vptr;
+
+  (void)(0 ? sptr : vptr); // expected-error{{operands to conditional of types 'NSString *' and 'void *' are incompatible in ARC mode}}
+}


        


More information about the cfe-commits mailing list