Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 4ea59c2b authored by Richard Trieu's avatar Richard Trieu
Browse files

Merging rr285370:

------------------------------------------------------------------------
r285370 | rtrieu | 2016-10-27 17:15:24 -0700 (Thu, 27 Oct 2016) | 10 lines

Fix a crash on invalid code.

The diagnostic was attempting to access the QualType of a TypeDecl by calling
TypeDecl::getTypeForDecl.  However, the Type pointer stored there is lazily
loaded by functions in ASTContext.  In most cases, the pointer is loaded and
this does not cause a problem.  However, when more that 50 or so unknown types
are seen beforehand, this causes the Type to not be loaded, passing a null
Type to the diagnostics, leading to the crash.  Using
ASTContext::getTypeDeclType will give a proper QualType for all cases.

------------------------------------------------------------------------


git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_39@286923 91177308-0d34-0410-b5e6-96231b3b80d8
parent 787744fa
No related branches found
No related tags found
No related merge requests found
......@@ -806,7 +806,7 @@ bool Sema::BuildCXXNestedNameSpecifier(Scope *S,
if (!Found.empty()) {
if (TypeDecl *TD = Found.getAsSingle<TypeDecl>())
Diag(IdentifierLoc, diag::err_expected_class_or_namespace)
<< QualType(TD->getTypeForDecl(), 0) << getLangOpts().CPlusPlus;
<< Context.getTypeDeclType(TD) << getLangOpts().CPlusPlus;
else {
Diag(IdentifierLoc, diag::err_expected_class_or_namespace)
<< &Identifier << getLangOpts().CPlusPlus;
......
......@@ -435,3 +435,21 @@ namespace PR16951 {
// expected-error{{no member named 'X2' in 'PR16951::enumerator_2'}}
}
namespace PR30619 {
c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d;
// expected-error@-1 16{{unknown type name 'c'}}
c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d;
// expected-error@-1 16{{unknown type name 'c'}}
c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d;
// expected-error@-1 16{{unknown type name 'c'}}
c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d; c d;
// expected-error@-1 16{{unknown type name 'c'}}
namespace A {
class B {
typedef C D; // expected-error{{unknown type name 'C'}}
A::D::F;
// expected-error@-1{{'D' (aka 'int') is not a class, namespace, or enumeration}}
};
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment