зеркало из https://github.com/microsoft/clang-1.git
Be a bit more careful with undefined CXXRecordDecls. Fixes
rdar://problem/8124080 and PR7118. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107358 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
34161996e5
Коммит
025291b591
|
@ -131,11 +131,13 @@ static std::pair<unsigned,unsigned>
|
|||
InDiag = diag::note_protected_by_variable_init;
|
||||
|
||||
CanQualType T = VD->getType()->getCanonicalTypeUnqualified();
|
||||
while (CanQual<ArrayType> AT = T->getAs<ArrayType>())
|
||||
T = AT->getElementType();
|
||||
if (CanQual<RecordType> RT = T->getAs<RecordType>())
|
||||
if (!cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor())
|
||||
OutDiag = diag::note_exits_dtor;
|
||||
if (!T->isDependentType()) {
|
||||
while (CanQual<ArrayType> AT = T->getAs<ArrayType>())
|
||||
T = AT->getElementType();
|
||||
if (CanQual<RecordType> RT = T->getAs<RecordType>())
|
||||
if (!cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor())
|
||||
OutDiag = diag::note_exits_dtor;
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_pair(InDiag, OutDiag);
|
||||
|
|
|
@ -1127,7 +1127,7 @@ bool Sema::LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
|
|||
// If this isn't a C++ class, we aren't allowed to look into base
|
||||
// classes, we're done.
|
||||
CXXRecordDecl *LookupRec = dyn_cast<CXXRecordDecl>(LookupCtx);
|
||||
if (!LookupRec)
|
||||
if (!LookupRec || !LookupRec->getDefinition())
|
||||
return false;
|
||||
|
||||
// If we're performing qualified name lookup into a dependent class,
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
// <rdar://problem/8124080>
|
||||
template<typename _Alloc> class allocator;
|
||||
template<class _CharT> struct char_traits;
|
||||
template<typename _CharT, typename _Traits = char_traits<_CharT>,
|
||||
typename _Alloc = allocator<_CharT> >
|
||||
class basic_string;
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
const typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_max_size // expected-error{{no member named '_Rep' in 'basic_string<_CharT, _Traits, _Alloc>'}}
|
||||
= (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4;
|
||||
|
||||
// PR7118
|
||||
template<typename T>
|
||||
class Foo {
|
||||
class Bar;
|
||||
void f() {
|
||||
Bar i;
|
||||
}
|
||||
};
|
Загрузка…
Ссылка в новой задаче