llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.03k stars 11.58k forks source link

[clang] [frontend] crash on parsing ternary operator with `vector_size` as condition guard #101718

Open pskrgag opened 1 month ago

pskrgag commented 1 month ago

I've observed clang's frontend crash during compilation of following code

#include <stdint.h>

typedef int64_t vec __attribute__((vector_size(32)));

vec foo (vec x, vec y)
{
  return *((vec){ 0, 0, 0, 0 } ? &x : &y);
}

Reproduces in both C and CXX modes.

Godbolt link: https://godbolt.org/z/sxMhz5eGW

Backtrace:

clang-19: /home/paskripkin/Documents/git/llvm-project/clang/lib/AST/ASTContext.cpp:4433: clang::QualType clang::ASTContext::getVectorType(clang::QualType, unsigned int, clang::VectorKind) const: Assertion `vecType->isBuiltinType() || (vecType->isBitIntType() && llvm::isPowerOf2_32(vecType->castAs<BitIntType>()->getNumBits()) && vecType->castAs<BitIntType>()->getNumBits() >= 8)' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.  Program arguments: /home/paskripkin/Documents/git/llvm-project/build/bin/clang-19 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -main-file-name bug.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/paskripkin/Documents/csa -fcoverage-compilation-dir=/home/paskripkin/Documents/csa -resource-dir /home/paskripkin/Documents/git/llvm-project/build/lib/clang/20 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/x86_64-linux-gnu -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/backward -internal-isystem /home/paskripkin/Documents/git/llvm-project/build/lib/clang/20/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/bug-32401e.o -x c++ bug.cpp
1.  bug.cpp:7:41: current parser token ')'
2.  bug.cpp:6:1: parsing function body 'foo'
3.  bug.cpp:6:1: in compound statement ('{}')
 #0 0x0000000004c6b8b6 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22
 #1 0x0000000004c6bcf4 PrintStackTraceSignalHandler(void*) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x0000000004c6947a llvm::sys::RunSignalHandlers() /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/Signals.cpp:105:20
 #3 0x0000000004c6b292 SignalHandler(int) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x00007fc1cfa389a0 __restore_rt (/lib64/libc.so.6+0x3e9a0)
 #5 0x00007fc1cfa8a834 __pthread_kill_implementation (/lib64/libc.so.6+0x90834)
 #6 0x00007fc1cfa388ee gsignal (/lib64/libc.so.6+0x3e8ee)
 #7 0x00007fc1cfa208ff abort (/lib64/libc.so.6+0x268ff)
 #8 0x00007fc1cfa2081b _nl_load_domain.cold (/lib64/libc.so.6+0x2681b)
 #9 0x00007fc1cfa30c57 (/lib64/libc.so.6+0x36c57)
#10 0x000000000a6b51bc clang::ASTContext::getVectorType(clang::QualType, unsigned int, clang::VectorKind) const /home/paskripkin/Documents/git/llvm-project/clang/lib/AST/ASTContext.cpp:4440:26
#11 0x000000000956fd42 clang::Sema::CheckVectorConditionalTypes(clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::SourceLocation) /home/paskripkin/Documents/git/llvm-project/clang/lib/Sema/SemaExprCXX.cpp:6734:41
#12 0x0000000009570e22 clang::Sema::CXXCheckConditionalOperands(clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ExprValueKind&, clang::ExprObjectKind&, clang::SourceLocation) /home/paskripkin/Documents/git/llvm-project/clang/lib/Sema/SemaExprCXX.cpp:6934:67
#13 0x000000000929f3eb clang::Sema::CheckConditionalOperands(clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ExprValueKind&, clang::ExprObjectKind&, clang::SourceLocation) /home/paskripkin/Documents/git/llvm-project/clang/lib/Sema/SemaExpr.cpp:8332:39
#14 0x00000000092a14ad clang::Sema::ActOnConditionalOp(clang::SourceLocation, clang::SourceLocation, clang::Expr*, clang::Expr*, clang::Expr*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Sema/SemaExpr.cpp:8770:45
#15 0x0000000008bbad87 clang::Parser::ParseRHSOfBinaryExpression(clang::ActionResult<clang::Expr*, true>, clang::prec::Level) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:669:55
#16 0x0000000008bb8865 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:185:58
#17 0x0000000008bb85f6 clang::Parser::ParseExpression(clang::Parser::TypeCastState) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:133:43
#18 0x0000000008bc7441 clang::Parser::ParseParenExpression(clang::Parser::ParenParseOption&, bool, bool, clang::OpaquePtr<clang::QualType>&, clang::SourceLocation&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:3348:29
#19 0x0000000008bbd7cf clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:1093:31
#20 0x0000000008bbb0ff clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, clang::Parser::TypeCastState, bool, bool*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:712:39
#21 0x0000000008bbf1ad clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:1485:30
#22 0x0000000008bbb0ff clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, clang::Parser::TypeCastState, bool, bool*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:712:39
#23 0x0000000008bb8849 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:182:39
#24 0x0000000008bb85f6 clang::Parser::ParseExpression(clang::Parser::TypeCastState) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:133:43
#25 0x0000000008c49f9c clang::Parser::ParseReturnStatement() /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:2469:26
#26 0x0000000008c41936 clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*, clang::ParsedAttributes&, clang::ParsedAttributes&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:350:31
#27 0x0000000008c40a6d clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:124:62
#28 0x0000000008c45298 clang::Parser::ParseCompoundStatementBody(bool) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:1257:38
#29 0x0000000008c4a44a clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:2535:47
#30 0x0000000008b2d1d9 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:1525:36
#31 0x0000000008b5f66c clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseDecl.cpp:2471:40
#32 0x0000000008b2bf22 clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:1249:24
#33 0x0000000008b2c0b7 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:1271:42
#34 0x0000000008b2b370 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:1074:50
#35 0x0000000008b2a06c clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:763:36
#36 0x0000000008b2513c clang::ParseAST(clang::Sema&, bool, bool) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseAST.cpp:171:37
#37 0x0000000005d1a3ce clang::ASTFrontendAction::ExecuteAction() /home/paskripkin/Documents/git/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1192:11
#38 0x0000000005a1a0fb clang::CodeGenAction::ExecuteAction() /home/paskripkin/Documents/git/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:1145:5
#39 0x0000000005d19d1f clang::FrontendAction::Execute() /home/paskripkin/Documents/git/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1082:38
#40 0x0000000005c3b523 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1061:42
#41 0x0000000005ebca29 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /home/paskripkin/Documents/git/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:280:38
#42 0x0000000000e1b113 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /home/paskripkin/Documents/git/llvm-project/clang/tools/driver/cc1_main.cpp:285:40
#43 0x0000000000e0cf90 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /home/paskripkin/Documents/git/llvm-project/clang/tools/driver/driver.cpp:215:20
#44 0x0000000000e0d48e clang_main(int, char**, llvm::ToolContext const&) /home/paskripkin/Documents/git/llvm-project/clang/tools/driver/driver.cpp:256:26
#45 0x0000000000e44b0d main /home/paskripkin/Documents/git/llvm-project/build/tools/clang/tools/driver/clang-driver.cpp:17:20
#46 0x00007fc1cfa2214a __libc_start_call_main (/lib64/libc.so.6+0x2814a)
#47 0x00007fc1cfa2220b __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x2820b)
#48 0x0000000000e0c3e5 _start (/home/paskripkin/Documents/git/llvm-project/build/bin/clang-19+0xe0c3e5)
llvmbot commented 1 month ago

@llvm/issue-subscribers-clang-frontend

Author: Pavel Skripkin (pskrgag)

I've observed clang's frontend crash during compilation of following code ``` #include <stdint.h> typedef int64_t vec __attribute__((vector_size(32))); vec foo (vec x, vec y) { return *((vec){ 0, 0, 0, 0 } ? &x : &y); } ``` Reproduces in both C and CXX modes. Godbolt link: https://godbolt.org/z/sxMhz5eGW Backtrace: ``` clang++: /home/paskripkin/Documents/git/llvm-project/clang/include/clang/AST/Type.h:957: const clang::ExtQualsTypeCommonBase* clang::QualType::getCommonPtr() const: Assertion `!isNull() && "Cannot retrieve a NULL type pointer"' failed. PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script. Stack dump: 0. Program arguments: /home/paskripkin/Documents/git/llvm-project/build/bin/clang++ --analyze -Xclang -analyzer-checker=core.UndefinedBinaryOperatorResult bug.cpp 1. bug.cpp:7:41: current parser token ')' 2. bug.cpp:6:1: parsing function body 'foo' 3. bug.cpp:6:1: in compound statement ('{}') #0 0x0000000004c6b8b6 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22 #1 0x0000000004c6bcf4 PrintStackTraceSignalHandler(void*) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1 #2 0x0000000004c6947a llvm::sys::RunSignalHandlers() /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/Signals.cpp:105:20 #3 0x0000000004c6b1a0 llvm::sys::CleanupOnSignal(unsigned long) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/Unix/Signals.inc:367:31 #4 0x0000000004b9f238 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:73:5 #5 0x0000000004b9f6c7 CrashRecoverySignalHandler(int) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:391:1 #6 0x00007f7ada65c9a0 __restore_rt (/lib64/libc.so.6+0x3e9a0) #7 0x00007f7ada6ae834 __pthread_kill_implementation (/lib64/libc.so.6+0x90834) #8 0x00007f7ada65c8ee gsignal (/lib64/libc.so.6+0x3e8ee) #9 0x00007f7ada6448ff abort (/lib64/libc.so.6+0x268ff) #10 0x00007f7ada64481b _nl_load_domain.cold (/lib64/libc.so.6+0x2681b) #11 0x00007f7ada654c57 (/lib64/libc.so.6+0x36c57) #12 0x0000000004fcbeb3 clang::QualType::getCommonPtr() const /home/paskripkin/Documents/git/llvm-project/clang/include/clang/AST/Type.h:958:73 #13 0x0000000004fcd7e2 clang::QualType::getTypePtr() const /home/paskripkin/Documents/git/llvm-project/clang/include/clang/AST/Type.h:7744:26 #14 0x0000000004fcc018 clang::QualType::operator->() const /home/paskripkin/Documents/git/llvm-project/clang/include/clang/AST/Type.h:1002:3 #15 0x000000000956fc32 clang::Sema::CheckVectorConditionalTypes(clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::SourceLocation) /home/paskripkin/Documents/git/llvm-project/clang/lib/Sema/SemaExprCXX.cpp:6725:40 #16 0x0000000009570e22 clang::Sema::CXXCheckConditionalOperands(clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ExprValueKind&, clang::ExprObjectKind&, clang::SourceLocation) /home/paskripkin/Documents/git/llvm-project/clang/lib/Sema/SemaExprCXX.cpp:6934:67 #17 0x000000000929f3eb clang::Sema::CheckConditionalOperands(clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ActionResult<clang::Expr*, true>&, clang::ExprValueKind&, clang::ExprObjectKind&, clang::SourceLocation) /home/paskripkin/Documents/git/llvm-project/clang/lib/Sema/SemaExpr.cpp:8332:39 #18 0x00000000092a14ad clang::Sema::ActOnConditionalOp(clang::SourceLocation, clang::SourceLocation, clang::Expr*, clang::Expr*, clang::Expr*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Sema/SemaExpr.cpp:8770:45 #19 0x0000000008bbad87 clang::Parser::ParseRHSOfBinaryExpression(clang::ActionResult<clang::Expr*, true>, clang::prec::Level) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:669:55 #20 0x0000000008bb8865 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:185:58 #21 0x0000000008bb85f6 clang::Parser::ParseExpression(clang::Parser::TypeCastState) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:133:43 #22 0x0000000008bc7441 clang::Parser::ParseParenExpression(clang::Parser::ParenParseOption&, bool, bool, clang::OpaquePtr<clang::QualType>&, clang::SourceLocation&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:3348:29 #23 0x0000000008bbd7cf clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:1093:31 #24 0x0000000008bbb0ff clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, clang::Parser::TypeCastState, bool, bool*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:712:39 #25 0x0000000008bbf1ad clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:1485:30 #26 0x0000000008bbb0ff clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, clang::Parser::TypeCastState, bool, bool*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:712:39 #27 0x0000000008bb8849 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:182:39 #28 0x0000000008bb85f6 clang::Parser::ParseExpression(clang::Parser::TypeCastState) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseExpr.cpp:133:43 #29 0x0000000008c49f9c clang::Parser::ParseReturnStatement() /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:2469:26 #30 0x0000000008c41936 clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*, clang::ParsedAttributes&, clang::ParsedAttributes&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:350:31 #31 0x0000000008c40a6d clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:124:62 #32 0x0000000008c45298 clang::Parser::ParseCompoundStatementBody(bool) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:1257:38 #33 0x0000000008c4a44a clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseStmt.cpp:2535:47 #34 0x0000000008b2d1d9 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:1525:36 #35 0x0000000008b5f66c clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseDecl.cpp:2471:40 #36 0x0000000008b2bf22 clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:1249:24 #37 0x0000000008b2c0b7 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:1271:42 #38 0x0000000008b2b370 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:1074:50 #39 0x0000000008b2a06c clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/Parser.cpp:763:36 #40 0x0000000008b2513c clang::ParseAST(clang::Sema&, bool, bool) /home/paskripkin/Documents/git/llvm-project/clang/lib/Parse/ParseAST.cpp:171:37 #41 0x0000000005d1a3ce clang::ASTFrontendAction::ExecuteAction() /home/paskripkin/Documents/git/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1192:11 #42 0x0000000005d19d1f clang::FrontendAction::Execute() /home/paskripkin/Documents/git/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1082:38 #43 0x0000000005c3b523 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1061:42 #44 0x0000000005ebca29 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /home/paskripkin/Documents/git/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:280:38 #45 0x0000000000e1b113 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /home/paskripkin/Documents/git/llvm-project/clang/tools/driver/cc1_main.cpp:285:40 #46 0x0000000000e0cf90 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /home/paskripkin/Documents/git/llvm-project/clang/tools/driver/driver.cpp:215:20 #47 0x0000000000e0d17d clang_main(int, char**, llvm::ToolContext const&)::'lambda'(llvm::SmallVectorImpl<char const*>&)::operator()(llvm::SmallVectorImpl<char const*>&) const /home/paskripkin/Documents/git/llvm-project/clang/tools/driver/driver.cpp:356:5 #48 0x0000000000e0e733 int llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::callback_fn<clang_main(int, char**, llvm::ToolContext const&)::'lambda'(llvm::SmallVectorImpl<char const*>&)>(long, llvm::SmallVectorImpl<char const*>&) /home/paskripkin/Documents/git/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:47:3 #49 0x0000000005a905c3 llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::operator()(llvm::SmallVectorImpl<char const*>&) const /home/paskripkin/Documents/git/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:3 #50 0x0000000005a8f332 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()::operator()() const /home/paskripkin/Documents/git/llvm-project/clang/lib/Driver/Job.cpp:440:32 #51 0x0000000005a8f749 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) /home/paskripkin/Documents/git/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:40 #52 0x00000000038eb8ac llvm::function_ref<void ()>::operator()() const /home/paskripkin/Documents/git/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:62 #53 0x0000000004b9f88f llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) /home/paskripkin/Documents/git/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:427:10 #54 0x0000000005a8f51e clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const /home/paskripkin/Documents/git/llvm-project/clang/lib/Driver/Job.cpp:440:7 #55 0x0000000005a313f1 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const /home/paskripkin/Documents/git/llvm-project/clang/lib/Driver/Compilation.cpp:199:22 #56 0x0000000005a3171d clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const /home/paskripkin/Documents/git/llvm-project/clang/lib/Driver/Compilation.cpp:253:62 #57 0x0000000005a43fb4 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) /home/paskripkin/Documents/git/llvm-project/clang/lib/Driver/Driver.cpp:1943:28 #58 0x0000000000e0e2ef clang_main(int, char**, llvm::ToolContext const&) /home/paskripkin/Documents/git/llvm-project/clang/tools/driver/driver.cpp:391:39 #59 0x0000000000e44b0d main /home/paskripkin/Documents/git/llvm-project/build/tools/clang/tools/driver/clang-driver.cpp:17:20 #60 0x00007f7ada64614a __libc_start_call_main (/lib64/libc.so.6+0x2814a) #61 0x00007f7ada64620b __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x2820b) #62 0x0000000000e0c3e5 _start (/home/paskripkin/Documents/git/llvm-project/build/bin/clang+++0xe0c3e5) clang++: error: clang frontend command failed with exit code 134 (use -v to see invocation) ```
pskrgag commented 1 month ago

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());
pskrgag commented 1 month ago

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.