Open pskrgag opened 1 month ago
@llvm/issue-subscribers-clang-frontend
Author: Pavel Skripkin (pskrgag)
So I guess, we should just no allow pointer types as result of conditional operator using vector types (gcc does not allow such). Casting pointers to vectors seems a bad idea
So smth like that (briefly tested locally) should work.
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 581434d33c5c..848c5ffda4ea 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 c5003d9ac025..a36587c30cd3 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -6727,6 +6727,11 @@ QualType Sema::CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS,
<< ResultElementTy;
return {};
}
+ if (ResultElementTy->isPointerType()) {
+ Diag(QuestionLoc, diag::err_conditional_vector_result_pointer_type)
+ << ResultElementTy;
+ return {};
+ }
if (CondType->isExtVectorType())
ResultType =
Context.getExtVectorType(ResultElementTy, CondVT->getNumElements());
Previous diff is kinda incomplete. Clang would anyway crash on following code:
#include <stdint.h>
typedef int64_t vec __attribute__((vector_size(32)));
vec foo (vec x, vec y)
{
return *((vec) { -1, 0, 0, -1 } ? 0 : &y);
}
So it's required to check for incompatible ternary arms before doing other checks. More complete diff:
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 581434d33c5c..848c5ffda4ea 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 c5003d9ac025..2c36612c8175 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -6722,6 +6722,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;
If this makes sense, I could open a PR.
I've observed clang's frontend crash during compilation of following code
Reproduces in both C and CXX modes.
Godbolt link: https://godbolt.org/z/sxMhz5eGW
Backtrace: