From 8c6db7056adf0779d708c1b4b8e7e01d7b3ccd92 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 9 Jan 2015 06:10:21 +0000 Subject: [PATCH] Sema: Don't crash when specializing a global scope function in a class We assumed that class-scope specializations would result in a CXXMethodDecl for that class. However, globally qualified functions will result in normal FunctionDecls. llvm-svn: 225508 --- clang/lib/Sema/SemaDecl.cpp | 2 +- clang/test/SemaTemplate/instantiate-method.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 8a50475..1e20121 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7482,7 +7482,7 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, } else if (isFunctionTemplateSpecialization) { if (CurContext->isDependentContext() && CurContext->isRecord() && !isFriend) { - isDependentClassScopeExplicitSpecialization = true; + isDependentClassScopeExplicitSpecialization = isa(NewFD); Diag(NewFD->getLocation(), getLangOpts().MicrosoftExt ? diag::ext_function_specialization_in_class : diag::err_function_specialization_in_class) diff --git a/clang/test/SemaTemplate/instantiate-method.cpp b/clang/test/SemaTemplate/instantiate-method.cpp index 4cc40af..c2d4704 100644 --- a/clang/test/SemaTemplate/instantiate-method.cpp +++ b/clang/test/SemaTemplate/instantiate-method.cpp @@ -195,3 +195,9 @@ namespace PR22040 { Foobar::bazqux(3); // expected-error{{no member named 'bazqux' in }} } } + +template +struct SpecializationOfGlobalFnInClassScope { + template <> + void ::Fn(); // expected-error{{cannot have a qualified name}} expected-error{{cannot specialize a function}} +}; -- 2.7.4