forked from OSchip/llvm-project
[AST][RecoveryExpr] Avoid spurious 'missing typename' diagnostic when the NNS contains errors.
Differential Revision: https://reviews.llvm.org/D82631
This commit is contained in:
parent
70f6389257
commit
d285f29317
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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}}
|
||||||
|
}
|
Loading…
Reference in New Issue