[PATCH] D80981: [AST] Fix a crash on accessing a class without definition in constexpr function context.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 2 01:04:59 PDT 2020
hokein created this revision.
hokein added a reviewer: sammccall.
Herald added a project: clang.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D80981
Files:
clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constant-expression-cxx2a.cpp
Index: clang/test/SemaCXX/constant-expression-cxx2a.cpp
===================================================================
--- clang/test/SemaCXX/constant-expression-cxx2a.cpp
+++ clang/test/SemaCXX/constant-expression-cxx2a.cpp
@@ -1401,3 +1401,15 @@
// decreasing address
static_assert(f(6) == 543210);
}
+
+namespace NoCrash {
+struct ForwardDecl; // expected-note {{forward declaration of}}
+struct Foo { // expected-note 2{{candidate constructor}}
+ ForwardDecl f; // expected-error {{field has incomplete type}}
+};
+
+constexpr Foo getFoo() {
+ Foo e = 123; // expected-error {{no viable conversion from 'int' to 'NoCrash::Foo'}}
+ return e;
+}
+}
Index: clang/lib/AST/ExprConstant.cpp
===================================================================
--- clang/lib/AST/ExprConstant.cpp
+++ clang/lib/AST/ExprConstant.cpp
@@ -4316,7 +4316,8 @@
if (auto *RD = T->getAsCXXRecordDecl()) {
if (RD->isUnion())
return APValue((const FieldDecl*)nullptr);
-
+ if (!RD->hasDefinition())
+ return APValue();
APValue Struct(APValue::UninitStruct(), RD->getNumBases(),
std::distance(RD->field_begin(), RD->field_end()));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80981.267804.patch
Type: text/x-patch
Size: 1191 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200602/91972a0a/attachment.bin>
More information about the cfe-commits
mailing list