r208402 - Permit duplicate explicit class instantiations if MSVCCompat is enabled

Will Wilson will at indefiant.com
Fri May 9 02:52:13 PDT 2014


Author: lantictac
Date: Fri May  9 04:52:13 2014
New Revision: 208402

URL: http://llvm.org/viewvc/llvm-project?rev=208402&view=rev
Log:
Permit duplicate explicit class instantiations if MSVCCompat is enabled

Added:
    cfe/trunk/test/SemaTemplate/ms-class-specialization-duplicate.cpp
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaTemplate.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=208402&r1=208401&r2=208402&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri May  9 04:52:13 2014
@@ -3396,6 +3396,9 @@ def err_nested_name_spec_non_tag : Error
 // C++ Explicit Instantiation
 def err_explicit_instantiation_duplicate : Error<
     "duplicate explicit instantiation of %0">;
+def warn_explicit_instantiation_duplicate : ExtWarn<
+    "duplicate explicit instantiation of %0 ignored as a Microsoft extension">,
+    InGroup<Microsoft>;
 def note_previous_explicit_instantiation : Note<
     "previous explicit instantiation is here">;
 def ext_explicit_instantiation_after_specialization : Extension<

Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=208402&r1=208401&r2=208402&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Fri May  9 04:52:13 2014
@@ -6526,8 +6526,12 @@ Sema::CheckSpecializationInstantiationRe
       //   For a given template and a given set of template-arguments,
       //     - an explicit instantiation definition shall appear at most once
       //       in a program,
-      Diag(NewLoc, diag::err_explicit_instantiation_duplicate)
-        << PrevDecl;
+
+      // MSVCCompat: MSVC silently ignores duplicate explicit instantiations.
+      Diag(NewLoc, (getLangOpts().MSVCCompat)
+                       ? diag::warn_explicit_instantiation_duplicate
+                       : diag::err_explicit_instantiation_duplicate)
+          << PrevDecl;
       Diag(DiagLocForExplicitInstantiation(PrevDecl, PrevPointOfInstantiation),
            diag::note_previous_explicit_instantiation);
       HasNoEffect = true;

Added: cfe/trunk/test/SemaTemplate/ms-class-specialization-duplicate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/ms-class-specialization-duplicate.cpp?rev=208402&view=auto
==============================================================================
--- cfe/trunk/test/SemaTemplate/ms-class-specialization-duplicate.cpp (added)
+++ cfe/trunk/test/SemaTemplate/ms-class-specialization-duplicate.cpp Fri May  9 04:52:13 2014
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -fms-compatibility -fdelayed-template-parsing -fsyntax-only -verify %s
+
+template <typename T>
+class A {
+};
+typedef int TInt;
+
+template class A<int>;  // expected-note {{previous explicit instantiation is here}}
+template class A<TInt>; // expected-warning {{duplicate explicit instantiation of 'A<int>' ignored as a Microsoft extension}}





More information about the cfe-commits mailing list