MicrosoftExtensions.cpp revision 6a24747beed797b2f1184c66ca45beb4db20eb08
120e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet// RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-extensions -fdelayed-template-parsing
2141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
3141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky/* Microsoft attribute tests */
4141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky[repeatable][source_annotation_attribute( Parameter|ReturnValue )]
5141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckystruct SA_Post{ SA_Post(); int attr; };
6141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
7141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky[returnvalue:SA_Post( attr=1)]
8141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckyint foo1([SA_Post(attr=1)] void *param);
9141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
10141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckynamespace {
11141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky  [returnvalue:SA_Post(attr=1)]
12141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky  int foo2([SA_Post(attr=1)] void *param);
13141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky}
14141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
15141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckyclass T {
16141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky  [returnvalue:SA_Post(attr=1)]
17141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky  int foo3([SA_Post(attr=1)] void *param);
18141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky};
19141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
20141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckyextern "C" {
21141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky  [returnvalue:SA_Post(attr=1)]
22141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky  int foo5([SA_Post(attr=1)] void *param);
23141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky}
24141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
25dfaa5fb15da115315513ce356169450a5963977fFrancois Pichetclass class_attr {
26dfaa5fb15da115315513ce356169450a5963977fFrancois Pichetpublic:
27dfaa5fb15da115315513ce356169450a5963977fFrancois Pichet  class_attr([SA_Pre(Null=SA_No,NullTerminated=SA_Yes)]  int a)
28dfaa5fb15da115315513ce356169450a5963977fFrancois Pichet  {
29dfaa5fb15da115315513ce356169450a5963977fFrancois Pichet  }
30dfaa5fb15da115315513ce356169450a5963977fFrancois Pichet};
31dfaa5fb15da115315513ce356169450a5963977fFrancois Pichet
32dfaa5fb15da115315513ce356169450a5963977fFrancois Pichet
33141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
34913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetvoid uuidof_test1()
35913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet{
36913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet  __uuidof(0);  // expected-error {{you need to include <guiddef.h> before using the '__uuidof' operator}}
37913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet}
38913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
39913b7bf8c40454641588611b7bbad981dc53c882Francois Pichettypedef struct _GUID
40913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet{
41913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet    unsigned long  Data1;
42913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet    unsigned short Data2;
43913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet    unsigned short Data3;
44913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet    unsigned char  Data4[8];
45913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet} GUID;
46913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
47913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetstruct __declspec(uuid(L"00000000-0000-0000-1234-000000000047")) uuid_attr_bad1 { };// expected-error {{'uuid' attribute requires parameter 1 to be a string}}
48913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetstruct __declspec(uuid(3)) uuid_attr_bad2 { };// expected-error {{'uuid' attribute requires parameter 1 to be a string}}
49913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetstruct __declspec(uuid("0000000-0000-0000-1234-0000500000047")) uuid_attr_bad3 { };// expected-error {{uuid attribute contains a malformed GUID}}
50913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetstruct __declspec(uuid("0000000-0000-0000-Z234-000000000047")) uuid_attr_bad4 { };// expected-error {{uuid attribute contains a malformed GUID}}
51913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetstruct __declspec(uuid("000000000000-0000-1234-000000000047")) uuid_attr_bad5 { };// expected-error {{uuid attribute contains a malformed GUID}}
52913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
53913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
54913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
55913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetstruct __declspec(uuid("000000A0-0000-0000-C000-000000000046"))
56913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetstruct_with_uuid { };
57913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetstruct struct_without_uuid { };
58913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
596915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichetstruct __declspec(uuid("000000A0-0000-0000-C000-000000000049"))
606915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichetstruct_with_uuid2;
616915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet
626915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichetstruct
636915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichetstruct_with_uuid2 {} ;
64913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
65913b7bf8c40454641588611b7bbad981dc53c882Francois Pichetint uuid_sema_test()
66913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet{
67913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   struct_with_uuid var_with_uuid[1];
68913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   struct_without_uuid var_without_uuid[1];
69913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
70913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(struct_with_uuid);
716915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet   __uuidof(struct_with_uuid2);
72913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(struct_without_uuid); // expected-error {{cannot call operator __uuidof on a type with no GUID}}
73913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(struct_with_uuid*);
74913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(struct_without_uuid*); // expected-error {{cannot call operator __uuidof on a type with no GUID}}
75913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
76913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(var_with_uuid);
77913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(var_without_uuid);// expected-error {{cannot call operator __uuidof on a type with no GUID}}
78913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(var_with_uuid[1]);
79913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(var_without_uuid[1]);// expected-error {{cannot call operator __uuidof on a type with no GUID}}
80913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(&var_with_uuid[1]);
81913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(&var_without_uuid[1]);// expected-error {{cannot call operator __uuidof on a type with no GUID}}
82913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
83913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(0);
84913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(1);// expected-error {{cannot call operator __uuidof on a type with no GUID}}
85913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet}
866915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet
876915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet
886915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichettemplate <class T>
896915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichetvoid template_uuid()
906915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet{
916915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet   T expr;
926915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet
936915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet   __uuidof(T);
946915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet   __uuidof(expr);
956915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet}
96dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
97dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
98a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichettemplate <class T, const GUID* g = &__uuidof(T)>
99a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichetclass COM_CLASS_TEMPLATE  { };
100a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichet
101a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichettypedef COM_CLASS_TEMPLATE<struct_with_uuid, &__uuidof(struct_with_uuid)> COM_TYPE_1;
102a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichettypedef COM_CLASS_TEMPLATE<struct_with_uuid> COM_TYPE_2;
103a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichet
104a343a415035aba553a5c21fad8fba6a6db83e0f9Francois Pichettemplate <class T, const GUID& g>
105a343a415035aba553a5c21fad8fba6a6db83e0f9Francois Pichetclass COM_CLASS_TEMPLATE_REF  { };
106a343a415035aba553a5c21fad8fba6a6db83e0f9Francois Pichettypedef COM_CLASS_TEMPLATE<struct_with_uuid, __uuidof(struct_with_uuid)> COM_TYPE_REF;
107a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichet
10820e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  struct late_defined_uuid;
10920e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  template<typename T>
11020e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  void test_late_defined_uuid() {
11120e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet    __uuidof(late_defined_uuid);
11220e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  }
11320e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  struct __declspec(uuid("000000A0-0000-0000-C000-000000000049")) late_defined_uuid;
11420e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet
115dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
116dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichetclass CtorCall {
117dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichetpublic:
118dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet  CtorCall& operator=(const CtorCall& that);
119dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
120dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet  int a;
121dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet};
122dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
123dbee3411a22b0dbb03267f5445f7b796104991bbFrancois PichetCtorCall& CtorCall::operator=(const CtorCall& that)
124dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet{
125dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    if (this != &that) {
126dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet        this->CtorCall::~CtorCall();
127dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet        this->CtorCall::CtorCall(that); // expected-warning {{explicit constructor calls are a Microsoft extension}}
128dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    }
129dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    return *this;
130dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet}
1314147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1324147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate <class A>
1334147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetclass C1 {
1344147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetpublic:
1354147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  template <int B>
1364147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  class Iterator {
1374147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  };
1384147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet};
1394147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1404147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate<class T>
1414147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetclass C2  {
1424147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  typename C1<T>:: /*template*/  Iterator<0> Mypos; // expected-warning {{use 'template' keyword to treat 'Iterator' as a dependent template name}}
1434147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet};
1444147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1454147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate <class T>
14620e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichetvoid missing_template_keyword(){
1474147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  typename C1<T>:: /*template*/ Iterator<0> Mypos; // expected-warning {{use 'template' keyword to treat 'Iterator' as a dependent template name}}
1484147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet}
1494147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
150a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet
151a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet
152a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichetclass AAAA { };
153a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet
154a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichettemplate <class T>
155a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichetvoid redundant_typename() {
156a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet   typename T t;// expected-warning {{expected a qualified name after 'typename'}}
157a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet   typename AAAA a;// expected-warning {{expected a qualified name after 'typename'}}
158a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet   t = 3;
159a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet}
160a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet
1614147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1620047012d99e9f80e242f9dbbc374049d478ffc6fFrancois Pichet__interface MicrosoftInterface;
1630047012d99e9f80e242f9dbbc374049d478ffc6fFrancois Pichet__interface MicrosoftInterface {
1640047012d99e9f80e242f9dbbc374049d478ffc6fFrancois Pichet   virtual void foo1() = 0;
1650047012d99e9f80e242f9dbbc374049d478ffc6fFrancois Pichet   virtual void foo2() = 0;
166338d7f7362d18fa9c39c6bb5282b4e20574a9309Francois Pichet};
167338d7f7362d18fa9c39c6bb5282b4e20574a9309Francois Pichet
168338d7f7362d18fa9c39c6bb5282b4e20574a9309Francois Pichet__int64 x7 = __int64(0);
1691e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet
1701e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet
1711e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet
1721e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet
1731e862693c63067ae467b0b3884c44f753cd6e821Francois Pichetclass IF_EXISTS {
1741e862693c63067ae467b0b3884c44f753cd6e821Francois Pichetprivate:
1751e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet    typedef int Type;
1761e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet};
1771e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet
1781e862693c63067ae467b0b3884c44f753cd6e821Francois Pichetint __if_exists_test() {
1791e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  int b=0;
1801e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  __if_exists(IF_EXISTS::Type) {
1811e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet     b++;
1821e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet     b++;
1831e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  }
1841e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  __if_exists(IF_EXISTS::Type_not) {
1851e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet     this wont compile.
1861e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  }
1871e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  __if_not_exists(IF_EXISTS::Type) {
1881e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet     this wont compile.
1891e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  }
1901e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  __if_not_exists(IF_EXISTS::Type_not) {
1911e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet     b++;
1921e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet     b++;
1931e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet  }
194f986038beed360c031de8654cfba43a5d3184605Francois Pichet}
195f986038beed360c031de8654cfba43a5d3184605Francois Pichet
196f986038beed360c031de8654cfba43a5d3184605Francois Pichet
197f986038beed360c031de8654cfba43a5d3184605Francois Pichet__if_exists(IF_EXISTS::Type) {
198f986038beed360c031de8654cfba43a5d3184605Francois Pichet  int var23;
199f986038beed360c031de8654cfba43a5d3184605Francois Pichet}
200f986038beed360c031de8654cfba43a5d3184605Francois Pichet
201f986038beed360c031de8654cfba43a5d3184605Francois Pichet__if_exists(IF_EXISTS::Type_not) {
202f986038beed360c031de8654cfba43a5d3184605Francois Pichet this wont compile.
203f986038beed360c031de8654cfba43a5d3184605Francois Pichet}
204f986038beed360c031de8654cfba43a5d3184605Francois Pichet
205f986038beed360c031de8654cfba43a5d3184605Francois Pichet__if_not_exists(IF_EXISTS::Type) {
206f986038beed360c031de8654cfba43a5d3184605Francois Pichet this wont compile.
207f986038beed360c031de8654cfba43a5d3184605Francois Pichet}
2081e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet
209f986038beed360c031de8654cfba43a5d3184605Francois Pichet__if_not_exists(IF_EXISTS::Type_not) {
210f986038beed360c031de8654cfba43a5d3184605Francois Pichet  int var244;
2111e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet}
212a23ae3f45789f40cdfd939117284f977d2dc17a6Francois Pichet
213a23ae3f45789f40cdfd939117284f977d2dc17a6Francois Pichetint __identifier(generic) = 3;
214a23ae3f45789f40cdfd939117284f977d2dc17a6Francois Pichet
2156a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichetclass inline_definition_pure_spec {
2166a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet   virtual int f() = 0 { return 0; }// expected-warning {{function definition with pure-specifier is a Microsoft extension}}
2176a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet   virtual int f2() = 0;
2186a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet};
2196a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet
22020e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet
22120e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichetint main () {
22220e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  // Necessary to force instantiation in -fdelayed-template-parsing mode.
22320e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  test_late_defined_uuid<int>();
22420e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  redundant_typename<int>();
22520e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  missing_template_keyword<int>();
22620e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet}
22720e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet
228