forked from OSchip/llvm-project
Don't attempt to poke into an invalid field's class type
to mark its destructors as referenced which may cause a crash. Fixes radar 7896920 llvm-svn: 103953
This commit is contained in:
parent
fd7224fee0
commit
16f94c6e8f
|
@ -2139,7 +2139,8 @@ Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location,
|
|||
for (CXXRecordDecl::field_iterator I = ClassDecl->field_begin(),
|
||||
E = ClassDecl->field_end(); I != E; ++I) {
|
||||
FieldDecl *Field = *I;
|
||||
|
||||
if (Field->isInvalidDecl())
|
||||
continue;
|
||||
QualType FieldType = Context.getBaseElementType(Field->getType());
|
||||
|
||||
const RecordType* RT = FieldType->getAs<RecordType>();
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
template <typename T>
|
||||
class SmallVectorImpl {
|
||||
public:
|
||||
explicit SmallVectorImpl(unsigned N) {
|
||||
}
|
||||
|
||||
~SmallVectorImpl() { }
|
||||
|
||||
};
|
||||
|
||||
template <typename T, unsigned N>
|
||||
class SmallVector : public SmallVectorImpl<T> {
|
||||
typedef typename SmallVectorImpl<T>::U U; // expected-error {{no type named 'U' in 'SmallVectorImpl<CallSite>'}}
|
||||
enum {
|
||||
|
||||
MinUs = (static_cast<unsigned int>(sizeof(T))*N + // expected-error {{invalid application of 'sizeof' to an incomplete type 'CallSite'}}
|
||||
static_cast<unsigned int>(sizeof(U)) - 1) /
|
||||
static_cast<unsigned int>(sizeof(U)),
|
||||
NumInlineEltsElts = MinUs
|
||||
};
|
||||
U InlineElts[NumInlineEltsElts];
|
||||
public:
|
||||
SmallVector() : SmallVectorImpl<T>(NumInlineEltsElts) {
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class CallSite; // expected-note {{forward declaration of 'CallSite'}}
|
||||
class InlineFunctionInfo {
|
||||
public:
|
||||
explicit InlineFunctionInfo() {}
|
||||
SmallVector<CallSite, 2> DevirtualizedCalls; // expected-note {{in instantiation of template class 'SmallVector<CallSite, 2>' requested}}
|
||||
};
|
Loading…
Reference in New Issue