diff options
author | Richard Smith <richard@metafoo.co.uk> | 2020-03-27 20:59:49 -0700 |
---|---|---|
committer | Richard Smith <richard@metafoo.co.uk> | 2020-03-27 21:07:06 -0700 |
commit | 499b2a8d63ca9b319ce3aae462029f37ce7d96dd (patch) | |
tree | f03b62a55576ddb615ce3f5fd49438b793424af3 /clang/lib/Parse/Parser.cpp | |
parent | 9dd92a569721a3a37e32387b6677a2c023c32eea (diff) | |
download | llvm-499b2a8d63ca9b319ce3aae462029f37ce7d96dd.zip llvm-499b2a8d63ca9b319ce3aae462029f37ce7d96dd.tar.gz llvm-499b2a8d63ca9b319ce3aae462029f37ce7d96dd.tar.bz2 |
PR45294: Fix handling of assumed template names looked up in the lexical
scope.
There are a few contexts in which we assume a name is a template name;
if such a context is one where we should perform an unqualified lookup,
and lookup finds nothing, we would form a dependent template name even
if the name is not dependent. This happens in particular for the lookup
of a pseudo-destructor.
In passing, rename ActOnDependentTemplateName to just ActOnTemplateName
given that we apply it for non-dependent template names too.
Diffstat (limited to 'clang/lib/Parse/Parser.cpp')
-rw-r--r-- | clang/lib/Parse/Parser.cpp | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 47b5de3..a33e40b 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -1878,11 +1878,7 @@ bool Parser::TryAnnotateTypeOrScopeToken() { Tok.getLocation()); } else if (Tok.is(tok::annot_template_id)) { TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); - if (TemplateId->isInvalid()) - return true; - if (TemplateId->Kind != TNK_Type_template && - TemplateId->Kind != TNK_Dependent_template_name && - TemplateId->Kind != TNK_Undeclared_template) { + if (!TemplateId->mightBeType()) { Diag(Tok, diag::err_typename_refers_to_non_type_template) << Tok.getAnnotationRange(); return true; @@ -1891,14 +1887,13 @@ bool Parser::TryAnnotateTypeOrScopeToken() { ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(), TemplateId->NumArgs); - Ty = Actions.ActOnTypenameType(getCurScope(), TypenameLoc, SS, - TemplateId->TemplateKWLoc, - TemplateId->Template, - TemplateId->Name, - TemplateId->TemplateNameLoc, - TemplateId->LAngleLoc, - TemplateArgsPtr, - TemplateId->RAngleLoc); + Ty = TemplateId->isInvalid() + ? TypeError() + : Actions.ActOnTypenameType( + getCurScope(), TypenameLoc, SS, TemplateId->TemplateKWLoc, + TemplateId->Template, TemplateId->Name, + TemplateId->TemplateNameLoc, TemplateId->LAngleLoc, + TemplateArgsPtr, TemplateId->RAngleLoc); } else { Diag(Tok, diag::err_expected_type_name_after_typename) << SS.getRange(); |