llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Pavel Skripkin (pskrgag)

<details>
<summary>Changes</summary>

Fix clang crash on parsing ternary operator with incompatible or pointer types 
as result.

Closes: #<!-- -->101718

---
Full diff: https://github.com/llvm/llvm-project/pull/102004.diff


3 Files Affected:

- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+2) 
- (modified) clang/lib/Sema/SemaExprCXX.cpp (+10) 
- (modified) clang/test/SemaCXX/vector-size-conditional.cpp (+6-2) 


``````````diff
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 581434d33c5c9..848c5ffda4ea5 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8187,6 +8187,8 @@ def err_conditional_vector_has_void : Error<
   "GNU vector conditional operand cannot be %select{void|a throw 
expression}0">;
 def err_conditional_vector_operand_type
     : Error<"enumeration type %0 is not allowed in a vector conditional">;
+def err_conditional_vector_result_pointer_type
+    : Error<"pointer type %0 is not allowed in a vector conditional">;
 def err_conditional_vector_cond_result_mismatch
     : Error<"cannot mix vectors and extended vectors in a vector conditional">;
 def err_conditional_vector_mismatched
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 1b56b4cabd133..a43fc36fa8047 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -6719,6 +6719,16 @@ QualType Sema::CheckVectorConditionalTypes(ExprResult 
&Cond, ExprResult &LHS,
             : UsualArithmeticConversions(LHS, RHS, QuestionLoc,
                                          ACK_Conditional);
 
+    if (ResultElementTy.isNull()) {
+      Diag(QuestionLoc, diag::err_conditional_vector_mismatched)
+          << LHSType << RHSType;
+      return {};
+    }
+    if (ResultElementTy->isPointerType()) {
+      Diag(QuestionLoc, diag::err_conditional_vector_result_pointer_type)
+          << ResultElementTy;
+      return {};
+    }
     if (ResultElementTy->isEnumeralType()) {
       Diag(QuestionLoc, diag::err_conditional_vector_operand_type)
           << ResultElementTy;
diff --git a/clang/test/SemaCXX/vector-size-conditional.cpp 
b/clang/test/SemaCXX/vector-size-conditional.cpp
index afed1cdeec087..51a22504a0d33 100644
--- a/clang/test/SemaCXX/vector-size-conditional.cpp
+++ b/clang/test/SemaCXX/vector-size-conditional.cpp
@@ -110,6 +110,10 @@ void Operands() {
   (void)(four_shorts ? four_shorts : uss); // expected-error {{cannot convert 
between scalar type 'unsigned short' and vector type 'FourShorts'}}
   (void)(four_ints ? four_floats : us);    // expected-error {{cannot convert 
between scalar type 'unsigned int' and vector type 'FourFloats'}}
   (void)(four_ints ? four_floats : sint);  // expected-error {{cannot convert 
between scalar type 'int' and vector type 'FourFloats'}}
+  (void)(four_ints ? &four_floats : &sint);  // expected-error {{vector 
operands to the vector conditional must be the same type ('FourFloats *' and 
'int *')}}
+  (void)(four_ints ? &four_ints : &four_ints);  // expected-error {{pointer 
type 'FourInts *' is not allowed in a vector conditional}}
+  (void)(four_ints ? 0 : &four_ints);  // expected-error {{vector operands to 
the vector conditional must be the same type ('int' and 'FourInts *')}}
+  (void)(four_ints ? &four_ints: 0);  // expected-error {{vector operands to 
the vector conditional must be the same type ('FourInts *' and 'int')}}
 }
 
 template <typename T1, typename T2>
@@ -169,10 +173,10 @@ void all_dependent(Cond C, LHS L, RHS R) {
 void Templates() {
   dependent_cond(two_ints);
   dependent_operand(two_floats);
-  // expected-error@165 {{vector operands to the vector conditional must be 
the same type ('__attribute__((__vector_size__(4 * sizeof(unsigned int)))) 
unsigned int' (vector of 4 'unsigned int' values) and 
'__attribute__((__vector_size__(4 * sizeof(double)))) double' (vector of 4 
'double' values))}}}
+  // expected-error@169 {{vector operands to the vector conditional must be 
the same type ('__attribute__((__vector_size__(4 * sizeof(unsigned int)))) 
unsigned int' (vector of 4 'unsigned int' values) and 
'__attribute__((__vector_size__(4 * sizeof(double)))) double' (vector of 4 
'double' values))}}}
   all_dependent(four_ints, four_uints, four_doubles); // expected-note {{in 
instantiation of}}
 
-  // expected-error@165 {{vector operands to the vector conditional must be 
the same type ('__attribute__((__vector_size__(4 * sizeof(unsigned int)))) 
unsigned int' (vector of 4 'unsigned int' values) and 
'__attribute__((__vector_size__(2 * sizeof(unsigned int)))) unsigned int' 
(vector of 2 'unsigned int' values))}}}
+  // expected-error@169 {{vector operands to the vector conditional must be 
the same type ('__attribute__((__vector_size__(4 * sizeof(unsigned int)))) 
unsigned int' (vector of 4 'unsigned int' values) and 
'__attribute__((__vector_size__(2 * sizeof(unsigned int)))) unsigned int' 
(vector of 2 'unsigned int' values))}}}
   all_dependent(four_ints, four_uints, two_uints); // expected-note {{in 
instantiation of}}
   all_dependent(four_ints, four_uints, four_uints);
 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/102004
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to