[PATCH] MS compatibility - explicit specializations can be declared in any namespace
David Blaikie
dblaikie at gmail.com
Thu Mar 12 08:14:04 PDT 2015
Test case? Also I think we're trying to avoid implementing every random
extension from msvc, preferring to update choose where the number of
instances of code relying on the extension is small (& not in a platform
header) - do you have a particular case where this shows up a lot (such
that it's a substaintial burden to update the code to be conforming)?
I might be wrong about this, so others may come in to correct me, that's
just my vague understanding
On Mar 12, 2015 2:07 AM, "Alexey Frolov" <alexfrolov1878 at yandex.ru> wrote:
> Hi rsmith,
>
> MS compiler emits no errors in case of explicit specializations outside
> declaration enclosing namespaces, even when language extensions are
> disabled.
> The patch is to suppress errors and emit extension warnings if explicit
> specializations are not declared in the corresponding namespaces.
>
> This fixes PR13738.
>
> REPOSITORY
> rL LLVM
>
> http://reviews.llvm.org/D8283
>
> Files:
> llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
> llvm/tools/clang/lib/Sema/SemaTemplate.cpp
> llvm/tools/clang/test/SemaTemplate/ext_ms_template_spec.cpp
>
> Index: llvm/tools/clang/test/SemaTemplate/ext_ms_template_spec.cpp
> ===================================================================
> --- llvm/tools/clang/test/SemaTemplate/ext_ms_template_spec.cpp
> +++ llvm/tools/clang/test/SemaTemplate/ext_ms_template_spec.cpp
> @@ -0,0 +1,33 @@
> +// RUN: %clang_cc1 -fsyntax-only -fms-compatibility -std=c++11 -verify %s
> +
> +namespace A {
> +
> +template <class T>
> +class ClassTemplate; // expected-note {{explicitly specialized
> declaration is here}}
> +
> +template <class T1, class T2>
> +class ClassTemplatePartial; // expected-note {{explicitly specialized
> declaration is here}}
> +
> +template <typename T> struct X {
> + struct MemberClass; // expected-note {{explicitly specialized
> declaration is here}}
> + enum MemberEnumeration; // expected-note {{explicitly specialized
> declaration is here}}
> +};
> +
> +}
> +
> +namespace B {
> +
> +template <>
> +class A::ClassTemplate<int>; // expected-warning {{class template
> specialization of 'ClassTemplate' outside namespace enclosing 'A' is a
> Microsoft extension}}
> +
> +template <class T1>
> +class A::ClassTemplatePartial<T1, T1 *> {}; // expected-warning {{class
> template partial specialization of 'ClassTemplatePartial' outside namespace
> enclosing 'A' is a Microsoft extension}}
> +
> +template <>
> +struct A::X<int>::MemberClass; // expected-warning {{member class
> specialization of 'MemberClass' outside namespace enclosing 'A' is a
> Microsoft extension}}
> +
> +template <>
> +enum A::X<int>::MemberEnumeration; // expected-warning {{member
> enumeration specialization of 'MemberEnumeration' outside namespace
> enclosing 'A' is a Microsoft extension}}
> +
> +}
> +
> Index: llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
> ===================================================================
> --- llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
> +++ llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
> @@ -3445,6 +3445,12 @@
> "variable template partial|function template|member "
> "function|static data member|member class|member enumeration}0 "
> "specialization of %1 not in a namespace enclosing %2">;
> +def ext_ms_template_spec_redecl_out_of_scope: ExtWarn<
> + "%select{class template|class template partial|variable template|"
> + "variable template partial|function template|member "
> + "function|static data member|member class|member enumeration}0 "
> + "specialization of %1 outside namespace enclosing %2 "
> + "is a Microsoft extension">, InGroup<Microsoft>;
> def err_template_spec_redecl_global_scope : Error<
> "%select{class template|class template partial|variable template|"
> "variable template partial|function template|member "
> Index: llvm/tools/clang/lib/Sema/SemaTemplate.cpp
> ===================================================================
> --- llvm/tools/clang/lib/Sema/SemaTemplate.cpp
> +++ llvm/tools/clang/lib/Sema/SemaTemplate.cpp
> @@ -5835,11 +5835,13 @@
> if (isa<TranslationUnitDecl>(SpecializedContext))
> S.Diag(Loc, diag::err_template_spec_redecl_global_scope)
> << EntityKind << Specialized;
> - else if (isa<NamespaceDecl>(SpecializedContext))
> - S.Diag(Loc, diag::err_template_spec_redecl_out_of_scope)
> - << EntityKind << Specialized
> - << cast<NamedDecl>(SpecializedContext);
> - else
> + else if (isa<NamespaceDecl>(SpecializedContext)) {
> + int Diag = diag::err_template_spec_redecl_out_of_scope;
> + if (S.getLangOpts().MSVCCompat)
> + Diag = diag::ext_ms_template_spec_redecl_out_of_scope;
> + S.Diag(Loc, Diag) << EntityKind << Specialized
> + << cast<NamedDecl>(SpecializedContext);
> + } else
> llvm_unreachable("unexpected namespace context for specialization");
>
> S.Diag(Specialized->getLocation(), diag::note_specialized_entity);
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150312/832f718c/attachment.html>
More information about the cfe-commits
mailing list