<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/140130>140130</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang assertion failure in ASTStmtReader::VisitConstantExpr()
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
alexfh
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
alexfh
</td>
</tr>
</table>
<pre>
Clang crashes when reading AST with constexpr structs containing unions. A test case reduced from real-world code:
```
$ split-file - q
//--- a.cppmap
module "a" {
header "a.h"
}
//--- a.h
#include "b.h"
//--- b.h
#ifndef _B_H_
#define _B_H_
struct B {
consteval B() {}
union {
int a;
};
};
constexpr B b;
#endif
//--- c.cppmap
module "c" {
header "c.h"
}
//--- c.h
#include "b.h"
^D
$ cd q
$ $CLANG -iquote . -fmodule-name=c -Xclang=-fno-cxx-modules -Xclang=-fmodule-map-file-home-is-cwd -xc++ -Xclang=-emit-module -fmodules -fno-implicit-modules -fno-implicit-module-maps -std=c++20 -c c.cppmap -o c.pcm && $CLANG -iquote . -fmodule-name=a -fmodule-map-file=a.cppmap -Xclang=-fno-cxx-modules -Xclang=-fmodule-map-file-home-is-cwd -xc++ -Xclang=-emit-module -fmodules -fno-implicit-modules -fno-implicit-module-maps -Xclang=-fmodule-file=c.pcm -std=c++20 -c a.cppmap -o a.pcm
assert.h assertion failed at llvm/include/llvm/Support/Casting.h:109 in static bool llvm::isa_impl_cl<clang::FieldDecl, const clang::Decl *>::doit(const From *) [To = clang::FieldDecl, From = const clang::Decl *]: Val && "isa<> used on a null pointer"
@ 0x55c79770988a __assert_fail
@ 0x55c7878e6fb0 llvm::isa_impl_cl<>::doit()
@ 0x55c7878e6f38 llvm::isa_impl_wrap<>::doit()
@ 0x55c7878e6f15 llvm::isa_impl_wrap<>::doit()
@ 0x55c7878e6e88 llvm::CastIsPossible<>::isPossible()
@ 0x55c7878e6e55 llvm::CastInfo<>::isPossible()
@ 0x55c7878e6db8 llvm::isa<>()
@ 0x55c7878e7230 llvm::cast<>()
@ 0x55c78a88b77c clang::serialization::BasicReaderBase<>::readAPValue()
@ 0x55c78a891260 clang::serialization::ReadDispatcher<>::read<>()
@ 0x55c78a88f2bd clang::serialization::DataStreamBasicReader<>::readArray<>()
@ 0x55c78a88b399 clang::serialization::BasicReaderBase<>::readAPValue()
@ 0x55c78a9eaaed clang::ASTStmtReader::VisitConstantExpr()
@ 0x55c78aa186f4 clang::StmtVisitorBase<>::Visit()
@ 0x55c78aa0a095 clang::ASTReader::ReadStmtFromStream()
@ 0x55c78a7e4a2f clang::ASTReader::GetExternalDeclStmt()
@ 0x55c78a7e4ac1 clang::ASTReader::GetExternalDeclStmt()
@ 0x55c78d7583bf clang::LazyOffsetPtr<>::get()
@ 0x55c78d742662 clang::VarDecl::getInit()
@ 0x55c78a982e92 clang::ASTReader::PassInterestingDeclsToConsumer()
@ 0x55c78a7f678e clang::ASTReader::FinishedDeserializing()
@ 0x55c78a7f67b9 clang::ASTReader::FinishedDeserializing()
@ 0x55c78a811032 clang::ExternalASTSource::Deserializing::~Deserializing()
@ 0x55c78a7e6cdc clang::ASTReader::FindExternalVisibleDeclsByName()
@ 0x55c78a7e6d41 clang::ASTReader::FindExternalVisibleDeclsByName()
@ 0x55c78d77c4fc clang::DeclContext::lookupImpl()
@ 0x55c78d77c0d3 clang::DeclContext::lookup()
@ 0x55c78b9bba58 LookupDirect()
@ 0x55c78b9b72d5 CppNamespaceLookup()
@ 0x55c78b9b6656 clang::Sema::CppLookupName()
@ 0x55c78b9bb787 clang::Sema::LookupName()
@ 0x55c78b137aae clang::Sema::HandleDeclarator()
@ 0x55c78b136c99 clang::Sema::ActOnDeclarator()
@ 0x55c78a6959da clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes()
@ 0x55c78a694413 clang::Parser::ParseDeclGroup()
@ 0x55c78a5ab674 clang::Parser::ParseDeclOrFunctionDefInternal()
@ 0x55c78a5aa4b1 clang::Parser::ParseDeclarationOrFunctionDefinition()
@ 0x55c78a5a9a4c clang::Parser::ParseExternalDeclaration()
@ 0x55c78a5a6ec1 clang::Parser::ParseTopLevelDecl()
@ 0x55c78a59f616 clang::ParseAST()
@ 0x55c789f41475 clang::ASTFrontendAction::ExecuteAction()
@ 0x55c789f40a2b clang::FrontendAction::Execute()
@ 0x55c789deca4d clang::CompilerInstance::ExecuteAction()
@ 0x55c78785dea5 clang::ExecuteCompilerInvocation()
@ 0x55c78782b668 cc1_main()
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMmE1v47wRxz8NcyFkSNT7wQfZjvcJEDwbNMGit2BEjmK2entIKvHuoZ-9oOTYll_ktN1DgQCRR8PfzPw5JCWB1vKtRpyTcEEYgxK3xYYwRsLVHXRm06j5YLvLG_FzviyhfqNcgd6gph8brKlCELJ-o9nzC_2QZkN5U2uD21ZRbVTHjbYWA7K2Xl0tm1rPaEYNakM5aKQKRcdR0EI1lcWVzkejSkF5I5D4GXEzErm7PzcjLKC6LaVxClkidehfvXFN2NpxHAoz3rYVtMTNqkZ0JVJbFmGMknhB3IxuEASq3jrrK3UzEq9OGJv-ty9rXnaiR-R7571bvncraoEFfV28_vE6WAQWssa9ZRCCLj5z2Gn0DiVdEJYQlvZ3-jTooNHelVJZGwrEH35ap_5yf3HQe0Hz3T3mYy1kMUqXX1KGH5Q5CMOvCcMnhQnvV7v54WI3KwElLFg-Zn9-o478q2sM0hl1iiG-U0OFxF9x6vyd28Yi_sop6sbh260zuOjRrd2wCtp-7p1NU6EjtcM_BHW2nLAFYYvjEVhJsyPto2rax5BVW0q-v33ZakNp6mgjbJoDn7nU4XsxqdNQPmt5RQmLCIu-Ui_Qs1KsdU_8_xbjPIVdAYMMl8SCI7HAehE3A61RmdmGDhe24wuQJQoKhpble0XYetdlhK13hueubRtlCFsvQRtZv802xM88N6WyptqAkZzmTVMOAD8jfiY1vNpCXnlJ_OUud3tjLbEUK-QlYcthPdKju_YGJSwj_v1gEI00hCWD49ruVPauXbjh4qWhxF_Ra_DB2zpcjRKuiJ_RH1Ae2ohJDcRfEv-edhoFbWoKtO7KkraNrA2qYdXZDYIErv1H3W0Y8jiNYzdNEqD09XUQ99Uqe-Q7-CVxglGRu_SqWqfFE5ZejDiQ_OQS6ENB-x-jvPB3oTA5zsp2zYN-arSWue3ZA0serLeIYXhKrIvmv2OJPDlRf8fZjzsfFDN_NGUctDkddR4NkiSPY37cfBqVhFL-Arv4BtMCtOR_68-BBeiRQPaYz55-QNmdV7WPkXoscumNIJa_kroFwzeoTmNcKeVQRsFycSPCCgw8G4VQHRV0VoxS8PNmtNxP01sF_Y-qpQiAYhQke355NpX5TNyafkgtzdJuIFCb-22rrvLAS6IiGPEsrAc0Zxn25snOARfcNDxJ7zg1e20j2H1ukH2SF2MArJjgfUNzvzWoaijtBmnRN4Hc-31AEYeJn48yfIRfP78XhUbzZEad9IY3UAGLInaM-gGqPxg-hz_UN_RPE4YpmyjvCbR-sCcC9meipeuXxvZKV-F5n4ykK6I4wQn2WtZSb1Cs8LPxZf12E5mnvxWZeJ7rjxT4nE67UJpOcfw8T4-Rvelf02EOPRRxwU8X4Una4jOsXTR5ib3Si59_2se6CbAIvN8PFnHMg2KcsR22bGqDWzMYyqb5Z9c-VG053aQxd4X_BdIUJU_zHMKE0sfedSUV8vPGPjjHTISULtvWVqlb4Pj4lRhRFEajrQ0r2B3FbTsQLsp2kmmcxJcpX0R4fgyAlxF_QC2GOQQFpplcgbnnRzxNL4Mybr7XX-NAlIapgGPOEyh92CKU3mckmzorDKoDOatFZoySeWdQX23lKA0Cz6c3Y3xTzfQ0Qgh5FAc3Qd_Vuqu5zXeFRb_D1TDZyRACBLn3VRVGfFnL_ki_Vn0IKQR8uvrjU2YXY4IXIfemeS9N-4jvWA5vElN1p0XkRWes7PllalhaBF4Qnx7ta2UXfi0yfnjEud8i7wzuTNNIF1g-ehe6zpskCeQQjB71lk3VyhLVQ_8U9Lnpfzm3OAkFQjg-R_qxB_B7wy9P24jD8ihKKOfeawXy4Lv_THUn5r5I_RTucO7FQez7aeyFd5t54IZRHPk8TlORiNzHOAhiL_LtH2NhfCfnzGWhG3ohc93ED2d5kMS-6_I8yv088AISuFiBLGf2DWDWqLc7qXWHcy9wPd-9KyHHUu--5g2FDh_z1NwOcPLuTZPALaU2-oAw0pS4-7g3fh_vFNp3668_kN51qpxvjGm1deu_HL1Js-nyGW-qw5t8n0yrmn_0h8S6r0ETtt6V8T5n_w4AAP__wdz-Xg">