Index: clang/lib/Sema/SemaCXXScopeSpec.cpp =================================================================== --- clang/lib/Sema/SemaCXXScopeSpec.cpp +++ clang/lib/Sema/SemaCXXScopeSpec.cpp @@ -828,10 +828,14 @@ } if (!Found.empty()) { - if (TypeDecl *TD = Found.getAsSingle()) + if (TypeDecl *TD = Found.getAsSingle()) { Diag(IdInfo.IdentifierLoc, diag::err_expected_class_or_namespace) << Context.getTypeDeclType(TD) << getLangOpts().CPlusPlus; - else { + } else if (TemplateDecl *TD = Found.getAsSingle()) { + ParsedType SuggestedType; + DiagnoseUnknownTypeName(IdInfo.Identifier, IdInfo.IdentifierLoc, S, &SS, + SuggestedType); + } else { Diag(IdInfo.IdentifierLoc, diag::err_expected_class_or_namespace) << IdInfo.Identifier << getLangOpts().CPlusPlus; if (NamedDecl *ND = Found.getAsSingle()) Index: clang/test/SemaCXX/nested-name-spec.cpp =================================================================== --- clang/test/SemaCXX/nested-name-spec.cpp +++ clang/test/SemaCXX/nested-name-spec.cpp @@ -473,3 +473,10 @@ x: goto x; } } + +template +struct x; // expected-note {{template is declared here}} + +template +int issue55962 = x::a; // expected-error {{use of class template 'x' requires template arguments}} \ + // expected-warning {{variable templates are a C++14 extension}}