[AST][RecoveryExpr] Avoid spurious 'missing typename' diagnostic when the NNS contains errors.

Differential Revision: https://reviews.llvm.org/D82631
This commit is contained in:
Haojian Wu 2020-06-30 16:13:20 +02:00
parent 70f6389257
commit d285f29317
4 changed files with 17 additions and 1 deletions

View File

@ -214,6 +214,9 @@ public:
/// parameter pack (for C++11 variadic templates). /// parameter pack (for C++11 variadic templates).
bool containsUnexpandedParameterPack() const; bool containsUnexpandedParameterPack() const;
/// Whether this nested name specifier contains an error.
bool containsErrors() const;
/// Print this nested name specifier to the given output stream. If /// Print this nested name specifier to the given output stream. If
/// `ResolveTemplateArguments` is true, we'll print actual types, e.g. /// `ResolveTemplateArguments` is true, we'll print actual types, e.g.
/// `ns::SomeTemplate<int, MyClass>` instead of /// `ns::SomeTemplate<int, MyClass>` instead of

View File

@ -243,6 +243,10 @@ bool NestedNameSpecifier::containsUnexpandedParameterPack() const {
return getDependence() & NestedNameSpecifierDependence::UnexpandedPack; return getDependence() & NestedNameSpecifierDependence::UnexpandedPack;
} }
bool NestedNameSpecifier::containsErrors() const {
return getDependence() & NestedNameSpecifierDependence::Error;
}
/// Print this nested name specifier to the given output /// Print this nested name specifier to the given output
/// stream. /// stream.
void NestedNameSpecifier::print(raw_ostream &OS, const PrintingPolicy &Policy, void NestedNameSpecifier::print(raw_ostream &OS, const PrintingPolicy &Policy,

View File

@ -750,7 +750,10 @@ void Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II,
Diag(IILoc, IsTemplateName ? diag::err_no_member_template Diag(IILoc, IsTemplateName ? diag::err_no_member_template
: diag::err_typename_nested_not_found) : diag::err_typename_nested_not_found)
<< II << DC << SS->getRange(); << II << DC << SS->getRange();
else if (isDependentScopeSpecifier(*SS)) { else if (SS->isValid() && SS->getScopeRep()->containsErrors()) {
SuggestedType =
ActOnTypenameType(S, SourceLocation(), *SS, *II, IILoc).get();
} else if (isDependentScopeSpecifier(*SS)) {
unsigned DiagID = diag::err_typename_missing; unsigned DiagID = diag::err_typename_missing;
if (getLangOpts().MSVCCompat && isMicrosoftMissingTypename(SS, S)) if (getLangOpts().MSVCCompat && isMicrosoftMissingTypename(SS, S))
DiagID = diag::ext_typename_missing; DiagID = diag::ext_typename_missing;

View File

@ -0,0 +1,6 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// There should be no extra errors about missing 'typename' keywords.
void f() {
decltype(undef())::Type T; // expected-error {{use of undeclared identifier}}
}