[PATCH] D35108: Fix crash parsing invalid code
Olivier Goffart via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 7 00:51:36 PDT 2017
ogoffart created this revision.
The code in the test caused a crash with this backtrace:
RecordLayoutBuilder.cpp:2934: const clang::ASTRecordLayout &clang::ASTContext::getASTRecordLayout(const clang::RecordDecl *) const: Assertion `!D->isInvalidDecl() && "Cannot get layout of invalid decl!"' failed.
[...]
#7 0x00007f63963d845a __assert_fail_base (/usr/lib/libc.so.6+0x2c45a)
#8 0x00007f63963d84d2 (/usr/lib/libc.so.6+0x2c4d2)
#9 0x00007f63937a0631 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const /home/olivier/prog/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp:2935:3
#10 0x00007f63937a1ad5 getFieldOffset(clang::ASTContext const&, clang::FieldDecl const*) /home/olivier/prog/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp:3057:37
#11 0x00007f6391869f14 clang::Sema::RefersToMemberWithReducedAlignment(clang::Expr*, llvm::function_ref<void (clang::Expr*, clang::RecordDecl*, clang::FieldDecl*, clang::CharUnits)>) /home/olivier/prog/llvm/tools/clang/lib/Sema/SemaChecking.cpp:12139:23
#12 0x00007f639186a2f8 clang::Sema::CheckAddressOfPackedMember(clang::Expr*) /home/olivier/prog/llvm/tools/clang/lib/Sema/SemaChecking.cpp:12190:1
#13 0x00007f6391a7a81c clang::Sema::CheckAddressOfOperand(clang::ActionResult<clang::Expr*, true>&, clang::SourceLocation) /home/olivier/prog/llvm/tools/clang/lib/Sema/SemaExpr.cpp:11111:10
#14 0x00007f6391a7f5d2 clang::Sema::CreateBuiltinUnaryOp(clang::SourceLocation, clang::UnaryOperatorKind, clang::Expr*) /home/olivier/prog/llvm/tools/clang/lib/Sema/SemaExpr.cpp:11932:18
Fixing by bailing out for invalid classes.
https://reviews.llvm.org/D35108
Files:
lib/Sema/SemaChecking.cpp
test/Sema/address-packed.c
Index: test/Sema/address-packed.c
===================================================================
--- test/Sema/address-packed.c
+++ test/Sema/address-packed.c
@@ -329,3 +329,14 @@
uint32_t *p32;
p32 = &a[0].x; // no-warning
}
+
+struct Invalid0 {
+ void *x;
+ struct fwd f; // expected-error {{incomplete type}} expected-note {{forward declaration}}
+} __attribute__((packed));
+
+
+void *g14(struct Invalid0 *ivl)
+{
+ return &(ivl->x);
+}
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -12101,7 +12101,7 @@
ValueDecl *MD = ME->getMemberDecl();
auto *FD = dyn_cast<FieldDecl>(MD);
// We do not care about non-data members.
- if (!FD || FD->isInvalidDecl())
+ if (!FD || FD->isInvalidDecl() || RD->isInvalidDecl())
return;
AnyIsPacked =
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D35108.105590.patch
Type: text/x-patch
Size: 906 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170707/a7659fe7/attachment-0001.bin>
More information about the cfe-commits
mailing list