Author: Haojian Wu Date: 2022-09-23T10:36:55+02:00 New Revision: 4f8d92f1d6bea3bed2dc450ba33efa4a0f5baffb
URL: https://github.com/llvm/llvm-project/commit/4f8d92f1d6bea3bed2dc450ba33efa4a0f5baffb DIFF: https://github.com/llvm/llvm-project/commit/4f8d92f1d6bea3bed2dc450ba33efa4a0f5baffb.diff LOG: [clang] Fix the bogus diagnostic introduced by the newly-added UsingTemplate Kind. Reviewed By: sammccall Differential Revision: https://reviews.llvm.org/D123808 Added: Modified: clang/lib/Sema/SemaDeclCXX.cpp clang/test/CXX/temp/temp.deduct.guide/p3.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index bad298c8c8bc8..2516d18b31c25 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -11056,6 +11056,7 @@ void Sema::CheckDeductionGuideDeclarator(Declarator &D, QualType &R, // Check that the return type is written as a specialization of // the template specified as the deduction-guide's name. + // The template name may not be qualified. [temp.deduct.guide] ParsedType TrailingReturnType = Chunk.Fun.getTrailingReturnType(); TypeSourceInfo *TSI = nullptr; QualType RetTy = GetTypeFromParser(TrailingReturnType, &TSI); @@ -11067,9 +11068,13 @@ void Sema::CheckDeductionGuideDeclarator(Declarator &D, QualType &R, TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName(); bool TemplateMatches = Context.hasSameTemplateName(SpecifiedName, GuidedTemplate); - // FIXME: We should consider other template kinds (using, qualified), - // otherwise we will emit bogus diagnostics. - if (SpecifiedName.getKind() == TemplateName::Template && TemplateMatches) + auto TKind = SpecifiedName.getKind(); + // A Using TemplateName can't actually be valid (either it's qualified, or + // we're in the wrong scope). But we have diagnosed these problems + // already. + bool SimplyWritten = TKind == TemplateName::Template || + TKind == TemplateName::UsingTemplate; + if (SimplyWritten && TemplateMatches) AcceptableReturnType = true; else { // This could still instantiate to the right type, unless we know it diff --git a/clang/test/CXX/temp/temp.deduct.guide/p3.cpp b/clang/test/CXX/temp/temp.deduct.guide/p3.cpp index 33f70e5c019bb..cdc073066f3e3 100644 --- a/clang/test/CXX/temp/temp.deduct.guide/p3.cpp +++ b/clang/test/CXX/temp/temp.deduct.guide/p3.cpp @@ -55,8 +55,6 @@ namespace WrongScope { } using N::NamedNS1; NamedNS1(int) -> NamedNS1<int>; // expected-error {{deduction guide must be declared in the same scope as template}} - // FIXME: remove the following bogus diagnostic - // expected-error@-2{{deduction guide is not written as a specialization of template 'NamedNS1'}} using namespace N; NamedNS2(int) -> NamedNS2<int>; // expected-error {{deduction guide must be declared in the same scope as template}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits