diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index e0eaf341adcc..392656a5b69c 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3413,7 +3413,8 @@ def warn_cxx98_compat_template_outside_of_template : Warning< InGroup, DefaultIgnore; def err_non_type_template_in_nested_name_specifier : Error< - "qualified name refers into a specialization of function template %0">; + "qualified name refers into a specialization of %select{function|variable}0 " + "template %1">; def err_template_id_not_a_type : Error< "template name refers to non-type template %0">; def note_template_declared_here : Note< diff --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp b/clang/lib/Sema/SemaCXXScopeSpec.cpp index 13c9993bf4cd..58bde02d602b 100644 --- a/clang/lib/Sema/SemaCXXScopeSpec.cpp +++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp @@ -775,15 +775,15 @@ bool Sema::ActOnCXXNestedNameSpecifier(Scope *S, return false; } - // FIXME: Variable templates + TemplateDecl *TD = Template.get().getAsTemplateDecl(); if (Template.get().getAsOverloadedTemplate() || DTN || - isa(Template.get().getAsTemplateDecl())) { + isa(TD) || isa(TD)) { SourceRange R(TemplateNameLoc, RAngleLoc); if (SS.getRange().isValid()) R.setBegin(SS.getRange().getBegin()); Diag(CCLoc, diag::err_non_type_template_in_nested_name_specifier) - << Template.get() << R; + << (TD && isa(TD)) << Template.get() << R; NoteAllFoundTemplates(Template.get()); return true; } diff --git a/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp b/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp index 5af6c0ab5bf7..58aad34edd1d 100644 --- a/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp +++ b/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp @@ -433,9 +433,8 @@ namespace nested { } namespace nested_name { - template int a; - // FIXME: This triggers a crash. - //a::b c; + template int a; // expected-note {{variable template 'a' declared here}} + a::b c; // expected-error {{qualified name refers into a specialization of variable template 'a'}} class a {}; // expected-error {{identifier followed by '<' indicates a class template specialization but 'a' refers to a variable template}} enum a {}; // expected-error {{expected identifier or '{'}} expected-warning {{does not declare anything}}