Author: rsmith Date: Wed Apr 25 18:08:00 2018 New Revision: 330890 URL: http://llvm.org/viewvc/llvm-project?rev=330890&view=rev Log: Factor out common code for diagnosing missing template arguments.
In passing, add 'concept' to the list of template kinds in diagnostics. Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/lib/Sema/SemaExprMember.cpp cfe/trunk/lib/Sema/SemaTemplate.cpp cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp cfe/trunk/test/SemaCXX/cxx1y-variable-templates_top_level.cpp cfe/trunk/test/SemaTemplate/alias-templates.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Apr 25 18:08:00 2018 @@ -1984,7 +1984,7 @@ def err_auto_not_allowed : Error< "%select{'auto'|'decltype(auto)'|'__auto_type'|" "use of " "%select{class template|function template|variable template|alias template|" - "template template parameter|template}2 %3 requires template arguments; " + "template template parameter|concept|template}2 %3 requires template arguments; " "argument deduction}0 not allowed " "%select{in function prototype" "|in non-static struct member|in struct member" @@ -1998,7 +1998,7 @@ def err_auto_not_allowed : Error< def err_dependent_deduced_tst : Error< "typename specifier refers to " "%select{class template|function template|variable template|alias template|" - "template template parameter|template}0 member in %1; " + "template template parameter|concept|template}0 member in %1; " "argument deduction not allowed here">; def err_auto_not_allowed_var_inst : Error< "'auto' variable template instantiation is not allowed">; @@ -2078,7 +2078,7 @@ def err_deduced_class_template_compound_ "deduced class template specialization type">; def err_deduced_non_class_template_specialization_type : Error< "%select{<error>|function template|variable template|alias template|" - "template template parameter|template}0 %1 requires template arguments; " + "template template parameter|concept|template}0 %1 requires template arguments; " "argument deduction only allowed for class templates">; def err_deduced_class_template_ctor_ambiguous : Error< "ambiguous deduction for template arguments of %0">; @@ -2106,7 +2106,7 @@ def err_deduction_guide_invalid_specifie def err_deduction_guide_name_not_class_template : Error< "cannot specify deduction guide for " "%select{<error>|function template|variable template|alias template|" - "template template parameter|dependent template name}0 %1">; + "template template parameter|concept|dependent template name}0 %1">; def err_deduction_guide_wrong_scope : Error< "deduction guide must be declared in the same scope as template %q0">; def err_deduction_guide_defines_function : Error< @@ -3991,18 +3991,16 @@ def err_template_member_noparams : Error "extraneous 'template<>' in declaration of member %0">; def err_template_tag_noparams : Error< "extraneous 'template<>' in declaration of %0 %1">; -def err_template_decl_ref : Error< - "cannot refer to %select{class|variable}0 template %1 without a template argument list">; // C++ Template Argument Lists def err_template_missing_args : Error< "use of " "%select{class template|function template|variable template|alias template|" - "template template parameter|template}0 %1 requires template arguments">; + "template template parameter|concept|template}0 %1 requires template arguments">; def err_template_arg_list_different_arity : Error< "%select{too few|too many}0 template arguments for " "%select{class template|function template|variable template|alias template|" - "template template parameter|template}1 %2">; + "template template parameter|concept|template}1 %2">; def note_template_decl_here : Note<"template is declared here">; def err_template_arg_must_be_type : Error< "template argument for template type parameter must be a type">; Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Wed Apr 25 18:08:00 2018 @@ -1820,6 +1820,7 @@ public: VarTemplate, AliasTemplate, TemplateTemplateParam, + Concept, DependentTemplate }; TemplateNameKindForDiagnostics @@ -6229,6 +6230,8 @@ public: SourceLocation TemplateLoc, const TemplateArgumentListInfo *TemplateArgs); + void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc); + ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Apr 25 18:08:00 2018 @@ -724,13 +724,7 @@ void Sema::DiagnoseUnknownTypeName(Ident if (isTemplateName(S, SS ? *SS : EmptySS, /*hasTemplateKeyword=*/false, Name, nullptr, true, TemplateResult, MemberOfUnknownSpecialization) == TNK_Type_template) { - TemplateName TplName = TemplateResult.get(); - Diag(IILoc, diag::err_template_missing_args) - << (int)getTemplateNameKindForDiagnostics(TplName) << TplName; - if (TemplateDecl *TplDecl = TplName.getAsTemplateDecl()) { - Diag(TplDecl->getLocation(), diag::note_template_decl_here) - << TplDecl->getTemplateParameters()->getSourceRange(); - } + diagnoseMissingTemplateArguments(TemplateResult.get(), IILoc); return; } } @@ -1167,6 +1161,8 @@ Sema::getTemplateNameKindForDiagnostics( return TemplateNameKindForDiagnostics::AliasTemplate; if (isa<TemplateTemplateParmDecl>(TD)) return TemplateNameKindForDiagnostics::TemplateTemplateParam; + if (isa<ConceptDecl>(TD)) + return TemplateNameKindForDiagnostics::Concept; return TemplateNameKindForDiagnostics::DependentTemplate; } Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Apr 25 18:08:00 2018 @@ -2776,9 +2776,7 @@ ExprResult Sema::BuildDeclarationNameExp if (TemplateDecl *Template = dyn_cast<TemplateDecl>(D)) { // Specifically diagnose references to class templates that are missing // a template argument list. - Diag(Loc, diag::err_template_decl_ref) << (isa<VarTemplateDecl>(D) ? 1 : 0) - << Template << SS.getRange(); - Diag(Template->getLocation(), diag::note_template_decl_here); + diagnoseMissingTemplateArguments(TemplateName(Template), Loc); return ExprError(); } Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExprMember.cpp (original) +++ cfe/trunk/lib/Sema/SemaExprMember.cpp Wed Apr 25 18:08:00 2018 @@ -920,16 +920,12 @@ getVarTemplateSpecialization(Sema &S, Va const TemplateArgumentListInfo *TemplateArgs, const DeclarationNameInfo &MemberNameInfo, SourceLocation TemplateKWLoc) { - if (!TemplateArgs) { - S.Diag(MemberNameInfo.getBeginLoc(), diag::err_template_decl_ref) - << /*Variable template*/ 1 << MemberNameInfo.getName() - << MemberNameInfo.getSourceRange(); - - S.Diag(VarTempl->getLocation(), diag::note_template_decl_here); - + S.diagnoseMissingTemplateArguments(TemplateName(VarTempl), + MemberNameInfo.getBeginLoc()); return nullptr; } + DeclResult VDecl = S.CheckVarTemplateId( VarTempl, TemplateKWLoc, MemberNameInfo.getLoc(), *TemplateArgs); if (VDecl.isInvalid()) Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Apr 25 18:08:00 2018 @@ -3988,6 +3988,16 @@ Sema::CheckVarTemplateId(const CXXScopeS /*FoundD=*/nullptr, TemplateArgs); } +void Sema::diagnoseMissingTemplateArguments(TemplateName Name, + SourceLocation Loc) { + Diag(Loc, diag::err_template_missing_args) + << (int)getTemplateNameKindForDiagnostics(Name) << Name; + if (TemplateDecl *TD = Name.getAsTemplateDecl()) { + Diag(TD->getLocation(), diag::note_template_decl_here) + << TD->getTemplateParameters()->getSourceRange(); + } +} + ExprResult Sema::BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, @@ -4208,11 +4218,7 @@ bool Sema::CheckTemplateTypeArgument(Tem // is a template without any arguments. SourceRange SR = AL.getSourceRange(); TemplateName Name = Arg.getAsTemplateOrTemplatePattern(); - Diag(SR.getBegin(), diag::err_template_missing_args) - << (int)getTemplateNameKindForDiagnostics(Name) << Name << SR; - if (TemplateDecl *Decl = Name.getAsTemplateDecl()) - Diag(Decl->getLocation(), diag::note_template_decl_here); - + diagnoseMissingTemplateArguments(Name, SR.getEnd()); return true; } case TemplateArgument::Expression: { Modified: cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp (original) +++ cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp Wed Apr 25 18:08:00 2018 @@ -379,4 +379,3 @@ int main() { } // end ns PR24473 #endif // CPP1Y - Modified: cfe/trunk/test/SemaCXX/cxx1y-variable-templates_top_level.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1y-variable-templates_top_level.cpp?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/cxx1y-variable-templates_top_level.cpp (original) +++ cfe/trunk/test/SemaCXX/cxx1y-variable-templates_top_level.cpp Wed Apr 25 18:08:00 2018 @@ -30,8 +30,8 @@ namespace use_in_top_level_funcs { void no_deduce() { // template arguments are not deduced for uses of variable templates. - int ipi = pi; // expected-error {{cannot refer to variable template 'pi' without a template argument list}} - int icpi = cpi; // expected-error {{cannot refer to variable template 'cpi' without a template argument list}} + int ipi = pi; // expected-error {{use of variable template 'pi' requires template arguments}} + int icpi = cpi; // expected-error {{use of variable template 'cpi' requires template arguments}} } template<typename T> @@ -465,5 +465,5 @@ auto variadic2 = Variadic<int, int>; namespace VexingParse { template <typename> int var; // expected-note {{declared here}} - int x(var); // expected-error {{cannot refer to variable template 'var' without a template argument list}} + int x(var); // expected-error {{use of variable template 'var' requires template arguments}} } Modified: cfe/trunk/test/SemaTemplate/alias-templates.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/alias-templates.cpp?rev=330890&r1=330889&r2=330890&view=diff ============================================================================== --- cfe/trunk/test/SemaTemplate/alias-templates.cpp (original) +++ cfe/trunk/test/SemaTemplate/alias-templates.cpp Wed Apr 25 18:08:00 2018 @@ -256,12 +256,14 @@ namespace PR31514 { } namespace an_alias_template_is_not_a_class_template { - template<typename T> using Foo = int; // expected-note 2{{here}} + template<typename T> using Foo = int; // expected-note 3{{here}} Foo x; // expected-error {{use of alias template 'Foo' requires template arguments}} Foo<> y; // expected-error {{too few template arguments for alias template 'Foo'}} + int z = Foo(); // expected-error {{use of alias template 'Foo' requires template arguments}} - template<template<typename> class Bar> void f() { // expected-note 2{{here}} + template<template<typename> class Bar> void f() { // expected-note 3{{here}} Bar x; // expected-error {{use of template template parameter 'Bar' requires template arguments}} Bar<> y; // expected-error {{too few template arguments for template template parameter 'Bar'}} + int z = Bar(); // expected-error {{use of template template parameter 'Bar' requires template arguments}} } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits