Author: rsmith
Date: Mon Apr 23 11:38:30 2018
New Revision: 330626

URL: http://llvm.org/viewvc/llvm-project?rev=330626&view=rev
Log:
DR727: remove wrong assertion for use of class-scope explicit
specialization without -fms-extensions.

Modified:
    cfe/trunk/lib/Sema/SemaTemplate.cpp
    cfe/trunk/test/CXX/drs/dr7xx.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=330626&r1=330625&r2=330626&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Mon Apr 23 11:38:30 2018
@@ -7561,10 +7561,6 @@ Sema::ActOnClassTemplateSpecialization(S
       ClassTemplate->AddSpecialization(Specialization, InsertPos);
 
     if (CurContext->isDependentContext()) {
-      // -fms-extensions permits specialization of nested classes without
-      // fully specializing the outer class(es).
-      assert(getLangOpts().MicrosoftExt &&
-             "Only possible with -fms-extensions!");
       TemplateName CanonTemplate = Context.getCanonicalTemplateName(Name);
       CanonType = Context.getTemplateSpecializationType(
           CanonTemplate, Converted);

Modified: cfe/trunk/test/CXX/drs/dr7xx.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr7xx.cpp?rev=330626&r1=330625&r2=330626&view=diff
==============================================================================
--- cfe/trunk/test/CXX/drs/dr7xx.cpp (original)
+++ cfe/trunk/test/CXX/drs/dr7xx.cpp Mon Apr 23 11:38:30 2018
@@ -3,7 +3,7 @@
 // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions 
-pedantic-errors
 // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions 
-pedantic-errors
 
-namespace dr727 { // dr727: 7
+namespace dr727 { // dr727: partial
   struct A {
     template<typename T> struct C; // expected-note 6{{here}}
     template<typename T> void f(); // expected-note {{here}}
@@ -48,6 +48,33 @@ namespace dr727 { // dr727: 7
     template<typename T> struct A::C<T*****>; // expected-error {{not in class 
'A' or an enclosing namespace}}
     template<typename T> int A::N<T*****>; // expected-error {{not in class 
'A' or an enclosing namespace}}
   }
+
+  template<typename>
+  struct D {
+    template<typename T> struct C { typename T::error e; }; // expected-error 
{{no members}}
+    template<typename T> void f() { T::error; } // expected-error {{no 
members}}
+    template<typename T> static const int N = T::error; // expected-error 
2{{no members}} expected-error 0-1{{C++14}}
+
+    template<> struct C<int> {};
+    template<> void f<int>() {}
+    template<> static const int N<int>;
+
+    template<typename T> struct C<T*> {};
+    template<typename T> static const int N<T*>;
+  };
+
+  void d(D<int> di) {
+    D<int>::C<int>();
+    di.f<int>();
+    int a = D<int>::N<int>; // FIXME: expected-note {{instantiation of}}
+
+    D<int>::C<int*>();
+    int b = D<int>::N<int*>;
+
+    D<int>::C<float>(); // expected-note {{instantiation of}}
+    di.f<float>(); // expected-note {{instantiation of}}
+    int c = D<int>::N<float>; // expected-note {{instantiation of}}
+  }
 }
 
 namespace dr777 { // dr777: 3.7


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to