================ @@ -0,0 +1,114 @@ +// UNSUPPORTED: asserts +// REQUIRES: asserts +// ^ this attempts to say "don't actually run this test", because it's broken +// +// The point of this test is to demonstrate something that ExprConstant accepts, +// but Interp rejects. I had hoped to express that as the same file with two +// sets of RUNs: one for the classic evaluator, which would be expected to +// succeed, and one for the new interpreter which would be expected to fail (so +// the overall test passes just in case the new interpreter rejects something +// that the evaluator accepts). +// +// Using `XFAIL ... *` with `not` on the expected-to-pass lines isn't appropriate, +// it seems, because that will cause the test to pass when _any_ of the RUNs +// fail. +// +// We could use a RUN that groups all four commands into a single shell +// invocation that expresses the desired logical properties, possibly negating +// and using an `XFAIL` for clarity (?), but I suspect the long-term future +// of this test file is to get out of this situation and back into the "both +// match" category anyway. +// +// RUN: %clang_cc1 -verify=ref,both -std=c99 %s +// RUN: %clang_cc1 -verify=ref,both -std=c11 %s +// RUN: %clang_cc1 -verify=ref,both -std=c2x %s +// +// RUN: %clang_cc1 -verify=expected,both -std=c99 -fexperimental-new-constant-interpreter %s +// RUN: %clang_cc1 -verify=expected,both -std=c11 -fexperimental-new-constant-interpreter %s +// RUN: %clang_cc1 -verify=expected,both -std=c2x -fexperimental-new-constant-interpreter %s + +#pragma clang diagnostic ignored "-Wgnu-folding-constant" +#pragma clang diagnostic ignored "-Wempty-translation-unit" + +#if __STDC_VERSION__ >= 201112L +#define CHECK(cond) _Static_assert((cond), "") +#else +#pragma clang diagnostic ignored "-Wextra-semi" +#define CHECK(cond) +#endif + +typedef struct { + unsigned a, b; + char cc[2]; +} s_t; + +// out-of-order designated initialization +// array designated initialization +const s_t s1 = { .a = 2, .b = 4, .cc[0] = 8, .cc[1] = 16 } ; +const s_t s2 = { .b = 4, .a = 2, .cc[1] = 16, .cc[0] = 8 } ; + +CHECK(s1.a == s2.a && s1.b == s2.b); +CHECK(s1.cc[0] == s2.cc[0] && s1.cc[1] == s2.cc[1]); + +// nested designated initialization +const struct { + struct { unsigned v; } inner; +} nested_designated = { .inner.v = 3 }; +CHECK(nested_designated.inner.v == 3); + +// mixing of designated initializers and regular initializers +// both-warning@+1 {{excess elements in array initializer}} +const s_t s3 = { {}, .b = 4, {[1]=16, 8}}; +const s_t s4 = { .b = 4, {[1]=16}}; + +CHECK(s3.a == 0); +CHECK(s3.b == 4); +CHECK(s3.cc[0] == 0); +CHECK(s3.cc[1] == 16); + +CHECK(s3.a == s4.a && s3.b == s4.b); +CHECK(s3.cc[0] == s4.cc[0] && s3.cc[1] == s4.cc[1]); + +const unsigned fw = 2; +typedef struct { + struct { + unsigned : 4; + unsigned ff : fw; + unsigned : 12; + unsigned : 12; + } in[2]; + + unsigned of : 4; + unsigned : 0; +} bf_t; + +const bf_t bf0 = { }; +CHECK(bf0.in[0].ff == 0); +CHECK(bf0.in[1].ff == 0); ---------------- sethp wrote:
This is the line that crashes: somehow it makes it to https://github.com/llvm/llvm-project/blob/63587aee7d6bfde09fdd8e4d0699a6c485589274/clang/lib/AST/Interp/ByteCodeExprGen.cpp#L823 with a non-primitive element type. It might also affect C++-land, come to think of it, since I think Sema has a different Expr for `{}` than `T{}`, right? <details> <summary>backtrace</summary> ``` Stack dump: 0. Program arguments: /home/seth/Code/src/github.com/llvm/llvm-project/build/bin/clang -cc1 -internal-isystem /home/seth/Code/src/github.com/llvm/llvm-project/build/lib/clang/18/include -nostdsysteminc -verify -std=c2x -fsyntax-only -fexperimental-new-constant-interpreter -triple=x86_64-apple-macosx10.14.0 /home/seth/Code/src/github.com/llvm/llvm-project/clang/test/AST/Interp/records.c 1. /home/seth/Code/src/github.com/llvm/llvm-project/clang/test/AST/Interp/records.c:87:1 <Spelling=/home/seth/Code/src/github.com/llvm/llvm-project/clang/test/AST/Interp/records.c:34:21>: current parser token '_Static_assert' #0 0x0000555564304b66 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/seth/Code/src/github.com/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22 #1 0x0000555564304f79 PrintStackTraceSignalHandler(void*) /home/seth/Code/src/github.com/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1 #2 0x00005555643023b1 llvm::sys::RunSignalHandlers() /home/seth/Code/src/github.com/llvm/llvm-project/llvm/lib/Support/Signals.cpp:105:20 #3 0x000055556430444d SignalHandler(int) /home/seth/Code/src/github.com/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1 #4 0x00007ffff785a770 (/usr/lib/libc.so.6+0x40770) #5 0x00007ffff78ab32c (/usr/lib/libc.so.6+0x9132c) #6 0x00007ffff785a6c8 raise (/usr/lib/libc.so.6+0x406c8) #7 0x00007ffff78424b8 abort (/usr/lib/libc.so.6+0x284b8) #8 0x0000555564224207 bindingsErrorHandler(void*, char const*, bool) /home/seth/Code/src/github.com/llvm/llvm-project/llvm/lib/Support/ErrorHandling.cpp:222:55 #9 0x000055556a88586f clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::classifyPrim(clang::QualType) const /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.h:157:3 #10 0x000055556a87f407 clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::VisitImplicitValueInitExpr(clang::ImplicitValueInitExpr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:823:34 #11 0x000055556a89004e clang::StmtVisitorBase<llvm::make_const_ptr, clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>, bool>::Visit(clang::Stmt const*) /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/include/clang/AST/StmtNodes.inc:364:1 #12 0x000055556a885b7c clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visitInitializer(clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2321:21 #13 0x000055556a886d81 clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visitInitList(llvm::ArrayRef<clang::Expr const*>, clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:944:34 #14 0x000055556a87f9d9 clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::VisitInitListExpr(clang::InitListExpr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:999:45 #15 0x000055556a890036 clang::StmtVisitorBase<llvm::make_const_ptr, clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>, bool>::Visit(clang::Stmt const*) /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/include/clang/AST/StmtNodes.inc:358:1 #16 0x000055556a885b7c clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visitInitializer(clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2321:21 #17 0x000055556a886594 clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visitGlobalInitializer(clang::Expr const*, unsigned int) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.h:200:26 #18 0x000055556a885ebd clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visitVarDecl(clang::VarDecl const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2724:42 #19 0x000055556a87f1af clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::VisitDeclRefExpr(clang::DeclRefExpr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:3336:30 #20 0x000055556a8901b6 clang::StmtVisitorBase<llvm::make_const_ptr, clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>, bool>::Visit(clang::Stmt const*) /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/include/clang/AST/StmtNodes.inc:462:1 #21 0x000055556a885a6d clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visit(clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2309:21 #22 0x000055556a880443 clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::VisitMemberExpr(clang::MemberExpr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:1196:21 #23 0x000055556a88ff8e clang::StmtVisitorBase<llvm::make_const_ptr, clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>, bool>::Visit(clang::Stmt const*) /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/include/clang/AST/StmtNodes.inc:316:1 #24 0x000055556a885a6d clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visit(clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2309:21 #25 0x000055556a878e0e clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::VisitCastExpr(clang::CastExpr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:193:21 #26 0x000055556a896b79 clang::StmtVisitorBase<llvm::make_const_ptr, clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>, bool>::VisitImplicitCastExpr(clang::ImplicitCastExpr const*) /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/include/clang/AST/StmtNodes.inc:522:1 #27 0x000055556a890276 clang::StmtVisitorBase<llvm::make_const_ptr, clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>, bool>::Visit(clang::Stmt const*) /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/include/clang/AST/StmtNodes.inc:522:1 #28 0x000055556a885a6d clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visit(clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2309:21 #29 0x000055556a87f6a6 clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::VisitArraySubscriptExpr(clang::ArraySubscriptExpr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:862:19 #30 0x000055556a890696 clang::StmtVisitorBase<llvm::make_const_ptr, clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>, bool>::Visit(clang::Stmt const*) /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/include/clang/AST/StmtNodes.inc:812:1 #31 0x000055556a885a6d clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visit(clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2309:21 #32 0x000055556a880443 clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::VisitMemberExpr(clang::MemberExpr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:1196:21 #33 0x000055556a88ff8e clang::StmtVisitorBase<llvm::make_const_ptr, clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>, bool>::Visit(clang::Stmt const*) /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/include/clang/AST/StmtNodes.inc:316:1 #34 0x000055556a885a6d clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visit(clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2309:21 #35 0x000055556a88504a clang::interp::ByteCodeExprGen<clang::interp::EvalEmitter>::visitExpr(clang::Expr const*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/ByteCodeExprGen.cpp:2622:15 #36 0x000055556a8c5740 clang::interp::EvalEmitter::interpretExpr(clang::Expr const*, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/EvalEmitter.cpp:40:7 #37 0x000055556a85e2b7 clang::interp::Context::evaluateAsRValue(clang::interp::State&, clang::Expr const*, clang::APValue&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/Interp/Context.cpp:48:20 #38 0x000055556a7cae65 EvaluateAsRValue((anonymous namespace)::EvalInfo&, clang::Expr const*, clang::APValue&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/ExprConstant.cpp:15590:9 #39 0x000055556a7cb416 EvaluateAsRValue(clang::Expr const*, clang::Expr::EvalResult&, clang::ASTContext const&, (anonymous namespace)::EvalInfo&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/ExprConstant.cpp:15664:46 #40 0x000055556a7cb788 clang::Expr::EvaluateAsRValue(clang::Expr::EvalResult&, clang::ASTContext const&, bool) const /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/AST/ExprConstant.cpp:15713:28 #41 0x0000555568b852e5 GetExprRange(clang::ASTContext&, clang::Expr const*, unsigned int, bool, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaChecking.cpp:14676:3 #42 0x0000555568b8612d GetExprRange(clang::ASTContext&, clang::Expr const*, bool, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaChecking.cpp:14922:1 #43 0x0000555568b86ec5 CheckTautologicalComparison(clang::Sema&, clang::BinaryOperator*, clang::Expr*, clang::Expr*, llvm::APSInt const&, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaChecking.cpp:15166:42 #44 0x0000555568b87dc0 AnalyzeComparison(clang::Sema&, clang::BinaryOperator*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaChecking.cpp:15341:7 #45 0x0000555568b8f0d6 AnalyzeImplicitConversions(clang::Sema&, (anonymous namespace)::AnalyzeImplicitConversionsWorkItem, llvm::SmallVectorImpl<(anonymous namespace)::AnalyzeImplicitConversionsWorkItem>&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaChecking.cpp:16709:37 #46 0x0000555568b8f6c1 AnalyzeImplicitConversions(clang::Sema&, clang::Expr*, clang::SourceLocation, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaChecking.cpp:16780:25 #47 0x0000555568b90cce clang::Sema::CheckImplicitConversions(clang::Expr*, clang::SourceLocation) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaChecking.cpp:17074:29 #48 0x0000555568b943a4 clang::Sema::CheckCompletedExpr(clang::Expr*, clang::SourceLocation, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaChecking.cpp:18007:35 #49 0x000055556951ef82 clang::Sema::ActOnFinishFullExpr(clang::Expr*, clang::SourceLocation, bool, bool, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaExprCXX.cpp:9029:19 #50 0x000055556905b0b6 clang::Sema::BuildStaticAssertDeclaration(clang::SourceLocation, clang::Expr*, clang::Expr*, clang::SourceLocation, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaDeclCXX.cpp:17468:28 #51 0x00005555690592df clang::Sema::ActOnStaticAssertDeclaration(clang::SourceLocation, clang::Expr*, clang::Expr*, clang::SourceLocation) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Sema/SemaDeclCXX.cpp:17112:74 #52 0x000055556885bce7 clang::Parser::ParseStaticAssertDeclaration(clang::SourceLocation&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Parse/ParseDeclCXX.cpp:1063:46 #53 0x0000555568827e7e clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLocation*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Parse/ParseDecl.cpp:1956:46 #54 0x000055556880b14e clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Parse/Parser.cpp:988:30 #55 0x000055556880a48e clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Parse/Parser.cpp:762:36 #56 0x00005555688056d3 clang::ParseAST(clang::Sema&, bool, bool) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Parse/ParseAST.cpp:163:37 #57 0x00005555657be248 clang::ASTFrontendAction::ExecuteAction() /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1189:11 #58 0x00005555657bdb36 clang::FrontendAction::Execute() /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1079:38 #59 0x00005555656d7c6f clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1062:42 #60 0x000055556597227e clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:274:38 #61 0x000055556031445a cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /home/seth/Code/src/github.com/llvm/llvm-project/clang/tools/driver/cc1_main.cpp:232:40 #62 0x0000555560305e79 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/tools/driver/driver.cpp:215:20 #63 0x00005555603063c7 clang_main(int, char**, llvm::ToolContext const&) /home/seth/Code/src/github.com/llvm/llvm-project/clang/tools/driver/driver.cpp:256:26 #64 0x000055556033e66c main /home/seth/Code/src/github.com/llvm/llvm-project/build/tools/clang/tools/driver/clang-driver.cpp:17:20 #65 0x00007ffff7843cd0 (/usr/lib/libc.so.6+0x29cd0) #66 0x00007ffff7843d8a __libc_start_main (/usr/lib/libc.so.6+0x29d8a) #67 0x0000555560305225 _start (/home/seth/Code/src/github.com/llvm/llvm-project/build/bin/clang+0xadb1225) ``` </details> https://github.com/llvm/llvm-project/pull/87799 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits