Author: rtrieu Date: Mon Nov 14 19:16:26 2016 New Revision: 286923 URL: http://llvm.org/viewvc/llvm-project?rev=286923&view=rev Log: 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. ------------------------------------------------------------------------ Modified: cfe/branches/release_39/lib/Sema/SemaCXXScopeSpec.cpp cfe/branches/release_39/test/SemaCXX/nested-name-spec.cpp Modified: cfe/branches/release_39/lib/Sema/SemaCXXScopeSpec.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/Sema/SemaCXXScopeSpec.cpp?rev=286923&r1=286922&r2=286923&view=diff ============================================================================== --- cfe/branches/release_39/lib/Sema/SemaCXXScopeSpec.cpp (original) +++ cfe/branches/release_39/lib/Sema/SemaCXXScopeSpec.cpp Mon Nov 14 19:16:26 2016 @@ -806,7 +806,7 @@ bool Sema::BuildCXXNestedNameSpecifier(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; Modified: cfe/branches/release_39/test/SemaCXX/nested-name-spec.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/test/SemaCXX/nested-name-spec.cpp?rev=286923&r1=286922&r2=286923&view=diff ============================================================================== --- cfe/branches/release_39/test/SemaCXX/nested-name-spec.cpp (original) +++ cfe/branches/release_39/test/SemaCXX/nested-name-spec.cpp Mon Nov 14 19:16:26 2016 @@ -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}} +}; +} +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits