xref: /llvm-project/clang/test/SemaTemplate/ext_ms_template_spec.cpp (revision c660c8f5d2c76fe0cb18cd027057a58e2cb5de7b)
10068cb24SAlexey Bataev // RUN: %clang_cc1 -fsyntax-only -fms-extensions -std=c++11 -verify %s
20068cb24SAlexey Bataev 
30068cb24SAlexey Bataev namespace A {
40068cb24SAlexey Bataev 
50068cb24SAlexey Bataev template <class T>
60068cb24SAlexey Bataev class ClassTemplate; // expected-note {{explicitly specialized declaration is here}}
70068cb24SAlexey Bataev 
80068cb24SAlexey Bataev template <class T1, class T2>
90068cb24SAlexey Bataev class ClassTemplatePartial; // expected-note {{explicitly specialized declaration is here}}
100068cb24SAlexey Bataev 
110068cb24SAlexey Bataev template <typename T> struct X {
120068cb24SAlexey Bataev   struct MemberClass; // expected-note {{explicitly specialized declaration is here}}
130068cb24SAlexey Bataev   enum MemberEnumeration; // expected-note {{explicitly specialized declaration is here}} // expected-error {{ISO C++ forbids forward references to 'enum' types}}
140068cb24SAlexey Bataev };
150068cb24SAlexey Bataev 
160068cb24SAlexey Bataev }
170068cb24SAlexey Bataev 
180068cb24SAlexey Bataev namespace B {
190068cb24SAlexey Bataev 
200068cb24SAlexey Bataev template <>
21*c660c8f5SRichard Smith class A::ClassTemplate<int>; // expected-warning {{class template specialization of 'ClassTemplate' not in a namespace enclosing 'A' is a Microsoft extension}}
220068cb24SAlexey Bataev 
230068cb24SAlexey Bataev template <class T1>
24*c660c8f5SRichard Smith class A::ClassTemplatePartial<T1, T1 *> {}; // expected-warning {{class template partial specialization of 'ClassTemplatePartial' not in a namespace enclosing 'A' is a Microsoft extension}}
250068cb24SAlexey Bataev 
260068cb24SAlexey Bataev template <>
27*c660c8f5SRichard Smith struct A::X<int>::MemberClass; // expected-warning {{member class specialization of 'MemberClass' not in class 'X' or an enclosing namespace is a Microsoft extension}}
280068cb24SAlexey Bataev 
290068cb24SAlexey Bataev template <>
30*c660c8f5SRichard Smith enum A::X<int>::MemberEnumeration; // expected-warning {{member enumeration specialization of 'MemberEnumeration' not in class 'X' or an enclosing namespace is a Microsoft extension}} // expected-error {{ISO C++ forbids forward references to 'enum' types}}
310068cb24SAlexey Bataev 
320068cb24SAlexey Bataev }
330068cb24SAlexey Bataev 
34