From 09a6d705045fd9df06c9d36076c526c92da31eec Mon Sep 17 00:00:00 2001 From: Will Wilson Date: Fri, 9 May 2014 09:52:13 +0000 Subject: [PATCH] Permit duplicate explicit class instantiations if MSVCCompat is enabled git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208402 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 3 +++ lib/Sema/SemaTemplate.cpp | 8 ++++++-- test/SemaTemplate/ms-class-specialization-duplicate.cpp | 9 +++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 test/SemaTemplate/ms-class-specialization-duplicate.cpp diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index e33d2c1666..4b9b722770 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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; def note_previous_explicit_instantiation : Note< "previous explicit instantiation is here">; def ext_explicit_instantiation_after_specialization : Extension< diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 8c0261381c..dd2faf60d4 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -6526,8 +6526,12 @@ Sema::CheckSpecializationInstantiationRedecl(SourceLocation NewLoc, // 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; diff --git a/test/SemaTemplate/ms-class-specialization-duplicate.cpp b/test/SemaTemplate/ms-class-specialization-duplicate.cpp new file mode 100644 index 0000000000..183fdfc9bf --- /dev/null +++ b/test/SemaTemplate/ms-class-specialization-duplicate.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fms-compatibility -fdelayed-template-parsing -fsyntax-only -verify %s + +template +class A { +}; +typedef int TInt; + +template class A; // expected-note {{previous explicit instantiation is here}} +template class A; // expected-warning {{duplicate explicit instantiation of 'A' ignored as a Microsoft extension}} -- 2.40.0