llvm / llvm-project

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

Internal Compiler Error 17.0.1 and trunk with NTTP (16 sloc) #67134

Open ConorWilliams opened 9 months ago

ConorWilliams commented 9 months ago

Minimal example on godbolt.

llvmbot commented 9 months ago

@llvm/issue-subscribers-clang-frontend

Minimal example on [godbolt](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxCAAzKQADqgKhE4MHt6%2BekkpjgJBIeEsUTHxdpgOaUIETMQEGT5%2BXLaY9nkM1bUEBWGR0XG2NXUNWc0KQ93BvcX9sQCUtqhexMjsHOaxwcjeWADUJrFuCksrmAD6tKii7QfYJhoAghtbO5j7h8jj6FhUt/dPjwImBYCQMQPebgIAE8EoxWG83AhaqRdl8QCAUgAvc4EXahP6PcbELwOXZsVAAd32AHYrI9drs0AxxpgAG5iMmYSkQRG1RkCca7CDmABsRLmJgArBZ8ZKACIotEYk6rC5XJjtXaXZDvOWogjodHHZaq7UatLo5DLYiMAgQOZzXYMVCYVSrBK4ky0r1y/4%2Bg50gEPIEgsFvA5uckUgkPIkk3F4VY0qzU32xQP/YK0Kb85lA1QJYi7JheIi7VS6/bSqVy%2B27AC0t12icwEfMZmpIvbTa9KbTGcewVxLCYwXtvf%2BDIZNoIywYuw0Ab9qY4C1onElvD8HC0pFQnDc1msqJV4bMsR4pAImlXCwA1iAzJIAHQXgCcIrMIrfAA432YNB/SUf3idcOEkXgWAkDQNFIbdd33DheAUEBYOvHdV1IOBYBgRAUFQEE6GichKDQQj6BibZDGAM4CGJBg71ILBWRbAA1PBMApAB5WFt0vGhaCBYgUIgCIb1ICJglqKFOEvSTmGIKEuIibQKnQy8yLYQQuIYWgZIwpjMAiLxgDcMRaBQ7heCwEcjHEAz8BtSpWUwSzd1dCpSzWXch1acTswiYhpI8LBZN4Oi8CgqyFioAxgAUdjOJ4xgwpkQQRDEdgpDS%2BQlDUcTdDMfRqJQI9LH0PAIhQyAFlQD00ks%2BsvgOOVTEsawAIbL4ApagK2qsSwGy4swGw9BAbSYdBeFQFziGIPAsGq%2B0WjaC0IFcEYmlIQIpiKEpsmSVIBE2g7cjSHo9v6MZWjUqoJhO67VoETo6guvoYjGe7PEaPRxi6N6Zg%2BhZjVOCQ1w3LdxMQ8sfxFesRUkRkDCMIU6K8BjHQgXBCBIfZzy4OZwpvB1SAfWIX3PMxYa4WJv2pP9yf0TgINIKDJVg%2BDps4ZDUKvYmsNwiAkCWAgElLEj1vwIh5sNZp%2BHS0RxGy%2BXcpUdQDMK0gKSChIwvBjhNzgqHOC40sxdxVAqBhuGEaR6jUfou9MY8cjojx2IzEJvmMJJhBMEm/plrAlm2Y542kNsXn0K0EmHy4H9n0/H9qQ/ZOEepLhM6ZjhYkhgzEKJn2BfgbC8LIhIiLICgIHLyuUGR4AuBFGDDJY1ZEu43jUoEoSRLEgz5Ok1LB8U5TVIcVLNNtHS9PErBjNM8zLMvGzqPs3dHNuly3N4DyrSBcTfLA3cAqCxSQu88L5qingYrihKOM7lKrJyjKlekFXFDVgq9Ab0r2vKgFJatV6oCk4E1A0LV%2BodQ0ENEa9YxoTSmnuWaMtXLwGBjdSozh1oMHcN9UY208EA32s0HIR10gEK2uQ9oJCrorVus9L6mQtrlGwR0CYdCPqDC6A9Hhr1drvTBosE0WV9aG05nuTg1t4aIyoijJuz4NBKKFNjaW7sCaFxjgsP2AcYjLTjiKV8b5qSxB/H%2BSUUgOwihAtnEOIB2ZG3ztzSOaF%2BalyFiAEW5sJaYCliQBaegVZvyyh/WQX98oaz0NrJgutorZwkeHU2otSy7EtjI228jgC7EUco2BPICIVwohor20dbykF0VgfR%2Bt7GOMkQXVx3ttGkwkNSZ81iuD/jMJTSU55QKcFzk4hCLiykLA8YLJAtcKISymf0eKzAEgKAQKgAgrc2KP2SnxXgPdoh93EiPfSckpKjxUmpSeBEtIEBnvpDeRkTJmVoBZVKq87KXyYngJyjht7iT3l5Q%2Bgg/IGVPsFDAbyIo30wrFJg8UO6bO7rIEJEgwmCAierXcuhQIlWgYAyqwC9ygOZOA5qsRWplQsABaaqCFroJqgw9hLg8F8J2oUIRZDDrtD4TQ86gjAa/Swe0F69QqF8qehw/6PLSH8KFSw36nCJVXWBqeYRYFEnOI4BkxGwBkA6ggGjDGqj/FFg2Jopp5TKmB3vI%2BWIz5qTUkkFwQCAETH/jfBofp4FIIOLDmqnmbii4eOFmbcW1dZnEFCPCTgqhYayLtgooxeTd6GsCXLBFitQk5VRT/eIMS4m3wSXnYZHBknmzSVbKNNtNXaodujJ2QoXZFLdhseYWizX%2ByqZQGpnq6nh19aa2OEg3w2upJKMxsQ3yZw0DY7Ogz6kjPcYLCZ%2BFXZV1IoUuuWSuDUg0M0Zi6ykpdxfjs4SlB%2B67gOcPY5SlTkTxflPbSukbnWTuYvR5y8n22WAOvayHyt7oIMr8g%2BL8j7%2BUqmfKEF9xLgr1nwe%2BsKD38VTZlJFGa8pop0CAaQf9sU2CARg/F7RGrEtJQA8lCEqWLTw2w9oDL8EytdUQ9AXCMOJHZWkE69GuX5HlTEaQVG7q8OFfRvjTDxUst5bx5hP0hNyrE/tSQirRHKohkMrm6ry0xqyTktpyiuAGpxka/GpTiaWoAkomC5mLMWcw8zLt3rC29tGcXWAgaUmrJDWuii4a2CRujZkhuWmlHPkvH4/TybX5puQ5/VDP9pA5ugyqgtqni2pPSepvz9tN2Bd0wU5d7t5Mtt9m2i1djbMqakRHFCfrmkPlM5Zur5nrM50S%2BVgr%2BszDNYaaMhYs0UjOEkEAA%3D%3D%3D).
DimitryAndric commented 9 months ago

Assertion and backtrace (this is with 17.0.0 rc4):

Assertion failed: (!isNull() && "Cannot retrieve a NULL type pointer"), function getCommonPtr, file /usr/src/contrib/llvm-project/clang/include/clang/AST/Type.h, line 752.
PLEASE submit a bug report to https://bugs.freebsd.org/submit/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: clang++ -v -std=c++20 -S pr67134.cpp
1.      pr67134.cpp:12:35: at annotation token
2.      pr67134.cpp:12:27: lambda expression parsing
 #0 0x0000000005ba8531 PrintStackTrace /usr/src/contrib/llvm-project/llvm/lib/Support/Unix/Signals.inc:602:13
 #1 0x0000000005ba6845 RunSignalHandlers /usr/src/contrib/llvm-project/llvm/lib/Support/Signals.cpp:105:18
 #2 0x0000000005b6bb7b HandleCrash /usr/src/contrib/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:73:5
 #3 0x0000000005b6bb7b CrashRecoverySignalHandler /usr/src/contrib/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:390:51
 #4 0x000000082d4c460f handle_signal /usr/src/lib/libthr/thread/thr_sig.c:0:3
 #5 0x000000082d4c3bcb thr_sighandler /usr/src/lib/libthr/thread/thr_sig.c:245:1
 #6 0x0000000828c2b2d3 ([vdso]+0x2d3)
 #7 0x0000000830228fea thr_kill /usr/obj/usr/src/amd64.amd64/lib/libc/thr_kill.S:4:0
 #8 0x00000008301a1e54 _raise /usr/src/lib/libc/gen/raise.c:0:10
 #9 0x0000000830253a69 abort /usr/src/lib/libc/stdlib/abort.c:71:17
#10 0x0000000830185211 (/lib/libc.so.7+0x99211)
#11 0x0000000002bfb196 ComputeName /usr/src/contrib/llvm-project/clang/lib/AST/Expr.cpp:0:0
#12 0x0000000002c01566 __is_long /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/string:1734:33
#13 0x0000000002c01566 __get_pointer /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/string:1869:17
#14 0x0000000002c01566 data /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/string:1559:73
#15 0x0000000002c01566 StringRef /usr/src/contrib/llvm-project/llvm/include/llvm/ADT/StringRef.h:101:18
#16 0x0000000002c01566 EvaluateInContext /usr/src/contrib/llvm-project/clang/lib/AST/Expr.cpp:2367:19
#17 0x0000000002ca7f93 VisitSourceLocExpr /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:8840:20
#18 0x0000000002ca2128 Visit /usr/obj/usr/src/amd64.amd64/lib/clang/libclang/clang/AST/StmtNodes.inc:0:1
#19 0x0000000002ca31d6 SourceLocExprScopeGuard /usr/src/contrib/llvm-project/clang/include/clang/AST/CurrentSourceLocExprScope.h:54:45
#20 0x0000000002ca31d6 VisitCXXDefaultArgExpr /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:7499:29
#21 0x0000000002c32da0 EvaluatePointer /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:0:60
#22 0x0000000002c30311 Evaluate /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:15077:9
#23 0x0000000002c2c89c EvaluateInPlace /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:0:10
#24 0x0000000002c2fe21 EvaluateCallArg /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:6124:8
#25 0x0000000002c48b2a EvaluateArgs /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:6163:9
#26 0x0000000002c81c27 handleCallExpr /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:0:12
#27 0x0000000002c6ab16 SourceLocExprScopeGuard /usr/src/contrib/llvm-project/clang/include/clang/AST/CurrentSourceLocExprScope.h:54:45
#28 0x0000000002c6ab16 VisitCXXDefaultArgExpr /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:7499:29
#29 0x0000000002c636ad EvaluateRecord /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:0:50
#30 0x0000000002c2c92d EvaluateInPlace /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:0:14
#31 0x0000000002c2fe21 EvaluateCallArg /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:6124:8
#32 0x0000000002c48b2a EvaluateArgs /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:6163:9
#33 0x0000000002c30f16 HandleConstructorCall /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:6470:7
#34 0x0000000002c6746b VisitCXXConstructExpr /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:0:10
#35 0x0000000002c636ad EvaluateRecord /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:0:50
#36 0x0000000002c2c92d EvaluateInPlace /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:0:14
#37 0x0000000002c2c0a8 EvaluateAsConstantExpr /usr/src/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp:15427:58
#38 0x00000000045c0836 EvaluateConvertedConstantExpression /usr/src/contrib/llvm-project/clang/lib/Sema/SemaOverload.cpp:5971:57
#39 0x00000000045c0836 CheckConvertedConstantExpression /usr/src/contrib/llvm-project/clang/lib/Sema/SemaOverload.cpp:6022:10
#40 0x00000000045c0704 /usr/src/contrib/llvm-project/clang/lib/Sema/SemaOverload.cpp:6037:3
#41 0x000000000465a40e CheckTemplateArgument /usr/src/contrib/llvm-project/clang/lib/Sema/SemaTemplate.cpp:7288:28
#42 0x000000000465889a CheckTemplateArgument /usr/src/contrib/llvm-project/clang/lib/Sema/SemaTemplate.cpp:5654:11
#43 0x000000000464db30 CheckTemplateArgumentList /usr/src/contrib/llvm-project/clang/lib/Sema/SemaTemplate.cpp:5948:11
#44 0x000000000464cb4b CheckTemplateIdType /usr/src/contrib/llvm-project/clang/lib/Sema/SemaTemplate.cpp:3901:7
#45 0x000000000465036e isNull /usr/src/contrib/llvm-project/llvm/include/llvm/ADT/PointerUnion.h:142:33
#46 0x000000000465036e isNull /usr/src/contrib/llvm-project/clang/include/clang/AST/Type.h:804:31
#47 0x000000000465036e ActOnTemplateIdType /usr/src/contrib/llvm-project/clang/lib/Sema/SemaTemplate.cpp:4208:14
#48 0x0000000003da333f AnnotateTemplateIdTokenAsType /usr/src/contrib/llvm-project/clang/lib/Parse/ParseTemplate.cpp:1472:21
#49 0x0000000003d5b6fb ~NestedNameSpecifierLocBuilder /usr/src/contrib/llvm-project/clang/include/clang/AST/NestedNameSpecifier.h:385:9
#50 0x0000000003d5b6fb ~CXXScopeSpec /usr/src/contrib/llvm-project/clang/include/clang/Sema/DeclSpec.h:73:7
#51 0x0000000003d5b6fb ParseDeclarationSpecifiers /usr/src/contrib/llvm-project/clang/lib/Parse/ParseDecl.cpp:3866:5
#52 0x0000000003d57f85 ParseSpecifierQualifierList /usr/src/contrib/llvm-project/clang/lib/Parse/ParseDecl.cpp:2652:23
#53 0x0000000003d481af ParseTypeName /usr/src/contrib/llvm-project/clang/lib/Parse/ParseDecl.cpp:57:7
#54 0x0000000003d2402a operator() /usr/src/contrib/llvm-project/clang/lib/Parse/ParseExprCXX.cpp:1436:30
#55 0x0000000003d2402a ParseLambdaExpressionAfterIntroducer /usr/src/contrib/llvm-project/clang/lib/Parse/ParseExprCXX.cpp:1523:5
#56 0x0000000003d21326 ParseLambdaExpression /usr/src/contrib/llvm-project/clang/lib/Parse/ParseExprCXX.cpp:746:10
#57 0x0000000003d12b54 ParseCastExpression /usr/src/contrib/llvm-project/clang/lib/Parse/ParseExpr.cpp:0:13
#58 0x0000000003d0c15d ParseCastExpression /usr/src/contrib/llvm-project/clang/lib/Parse/ParseExpr.cpp:683:20
#59 0x0000000003d0c15d ParseAssignmentExpression /usr/src/contrib/llvm-project/clang/lib/Parse/ParseExpr.cpp:175:20
#60 0x0000000003d579ac ParseInitializer /usr/src/contrib/llvm-project/clang/include/clang/Parse/Parser.h:0:0
#61 0x0000000003d579ac ParseDeclarationAfterDeclaratorAndAttributes /usr/src/contrib/llvm-project/clang/lib/Parse/ParseDecl.cpp:2526:25
#62 0x0000000003d550bb ParseDeclGroup /usr/src/contrib/llvm-project/clang/lib/Parse/ParseDecl.cpp:2260:21
#63 0x0000000003cec7f8 ParseDeclOrFunctionDefInternal /usr/src/contrib/llvm-project/clang/lib/Parse/Parser.cpp:0:10
#64 0x0000000003cec0c7 ParseDeclarationOrFunctionDefinition /usr/src/contrib/llvm-project/clang/lib/Parse/Parser.cpp:1225:12
#65 0x0000000003ceb00d ParseExternalDeclaration /usr/src/contrib/llvm-project/clang/lib/Parse/Parser.cpp:0:14
#66 0x0000000003ce8ffa ParseTopLevelDecl /usr/src/contrib/llvm-project/clang/lib/Parse/Parser.cpp:742:10
#67 0x0000000003ce35be ParseAST /usr/src/contrib/llvm-project/clang/lib/Parse/ParseAST.cpp:162:5
#68 0x000000000364e95f Execute /usr/src/contrib/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1063:10
#69 0x00000000035c72ed getPtr /usr/src/contrib/llvm-project/llvm/include/llvm/Support/Error.h:270:42
#70 0x00000000035c72ed operator bool /usr/src/contrib/llvm-project/llvm/include/llvm/Support/Error.h:233:16
#71 0x00000000035c72ed ExecuteAction /usr/src/contrib/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1053:23
#72 0x000000000371b56d ExecuteCompilerInvocation /usr/src/contrib/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:272:25
#73 0x0000000002a2e459 cc1_main /usr/src/contrib/llvm-project/clang/tools/driver/cc1_main.cpp:249:15
#74 0x0000000002a3cf9c ExecuteCC1Tool /usr/src/contrib/llvm-project/clang/tools/driver/driver.cpp:366:12
#75 0x00000000034569fe operator() /usr/src/contrib/llvm-project/clang/lib/Driver/Job.cpp:440:30
#76 0x00000000034569fe callback_fn<(lambda at /usr/src/contrib/llvm-project/clang/lib/Driver/Job.cpp:440:22)> /usr/src/contrib/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#77 0x0000000005b6b919 operator() /usr/src/contrib/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:0:12
#78 0x0000000005b6b919 RunSafely /usr/src/contrib/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:426:3
#79 0x0000000003456034 Execute /usr/src/contrib/llvm-project/clang/lib/Driver/Job.cpp:440:7
#80 0x0000000003419f3a ExecuteCommand /usr/src/contrib/llvm-project/clang/lib/Driver/Compilation.cpp:199:15
#81 0x000000000341a208 ExecuteJobs /usr/src/contrib/llvm-project/clang/lib/Driver/Compilation.cpp:253:13
#82 0x0000000003435d41 empty /usr/src/contrib/llvm-project/llvm/include/llvm/ADT/SmallVector.h:94:46
#83 0x0000000003435d41 ExecuteCompilation /usr/src/contrib/llvm-project/clang/lib/Driver/Driver.cpp:1906:23
#84 0x0000000002a3c660 clang_main /usr/src/contrib/llvm-project/clang/tools/driver/driver.cpp:542:21
#85 0x0000000002a3989f /usr/src/usr.bin/clang/clang/clang-driver.cpp:0:10
#86 0x00000008301769da __libc_start1 /usr/src/lib/libc/csu/libc_start1.c:157:2
shafik commented 9 months ago

Code:

#include <source_location>

template <typename Char, unsigned N>
struct meow {
  consteval meow(Char const (&str)[N], std::source_location loc = std::source_location::current()) noexcept {}
};

template <meow>
struct ice {};

inline constexpr auto x = []() -> ice<"76"> {};

I removed a few things

shafik commented 9 months ago

CC @cor3ntin this looks related to source_location

RobbertProost commented 3 months ago

Another example that triggers the same assertion:

#include <source_location>

struct MyObject {
    int value(std::source_location source_location = std::source_location::current()) { return 1; }
};

int main() {
    MyObject my_object;
    []() -> decltype(my_object.value()) { return 0; };

    return 0;
}

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

zyn0217 commented 3 months ago

I think this is a side effect of D124351, where we deferred the determination of the call operator type of the lambda until just before we entered the lambda body. This results in an issue that the evaluation context of the trailing return type of a lambda e.g. ice<"76"> and decltype(my_object.value()) is unaware of the lambda type, hence a crash in SourceLocExpr::EvaluateInContext along the calculation of the current function i.e. the lambda's name.