1ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 %s -triple i386-mingw32 -std=c++11 -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-extensions -fms-compatibility -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
73cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman[returnvalue:SA_Post( attr=1)]
8141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckyint foo1([SA_Post(attr=1)] void *param);
9141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
10141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckynamespace {
113cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman  [returnvalue:SA_Post(attr=1)]
12141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky  int foo2([SA_Post(attr=1)] void *param);
13141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky}
14141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
15141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckyclass T {
163cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman  [returnvalue:SA_Post(attr=1)]
17141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky  int foo3([SA_Post(attr=1)] void *param);
18141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky};
19141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewycky
20141ecfeeb54948159facce6aeb586e2f6c406f78Nick Lewyckyextern "C" {
213cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman  [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()
353cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman{
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
473cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballmanstruct __declspec(uuid(L"00000000-0000-0000-1234-000000000047")) uuid_attr_bad1 { };// expected-error {{'uuid' attribute requires a string}}
483cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballmanstruct __declspec(uuid(3)) uuid_attr_bad2 { };// expected-error {{'uuid' attribute requires 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
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(uuid("000000A0-0000-0000-C000-000000000046")) int i; // expected-warning {{'uuid' attribute only applies to classes}}
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
623cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballmanstruct
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}}
75c420e3cbafbc0468645ca9aab1b71c76c30d280fDavid Majnemer   __uuidof(struct_with_uuid[1]);
76c420e3cbafbc0468645ca9aab1b71c76c30d280fDavid Majnemer   __uuidof(struct_with_uuid*[1]); // expected-error {{cannot call operator __uuidof on a type with no GUID}}
77c420e3cbafbc0468645ca9aab1b71c76c30d280fDavid Majnemer   __uuidof(const struct_with_uuid[1][1]);
78c420e3cbafbc0468645ca9aab1b71c76c30d280fDavid Majnemer   __uuidof(const struct_with_uuid*[1][1]); // expected-error {{cannot call operator __uuidof on a type with no GUID}}
79913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
80913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(var_with_uuid);
81913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(var_without_uuid);// expected-error {{cannot call operator __uuidof on a type with no GUID}}
82913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(var_with_uuid[1]);
83913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(var_without_uuid[1]);// expected-error {{cannot call operator __uuidof on a type with no GUID}}
84913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(&var_with_uuid[1]);
85913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(&var_without_uuid[1]);// expected-error {{cannot call operator __uuidof on a type with no GUID}}
86913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet
87913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(0);
88913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet   __uuidof(1);// expected-error {{cannot call operator __uuidof on a type with no GUID}}
89913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet}
906915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet
916915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet
926915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichettemplate <class T>
936915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichetvoid template_uuid()
946915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet{
956915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet   T expr;
963cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman
976915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet   __uuidof(T);
986915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet   __uuidof(expr);
996915c529dbb43073dad148c2e83a1c56bfcc05c8Francois Pichet}
100dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
101dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
102d1282ec56231c967439c1eb67fe4afe792287911David Majnemertemplate <class T, const GUID* g = &__uuidof(T)> // expected-note {{template parameter is declared here}}
103a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichetclass COM_CLASS_TEMPLATE  { };
104a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichet
105d1282ec56231c967439c1eb67fe4afe792287911David Majnemertypedef COM_CLASS_TEMPLATE<struct_with_uuid, &*&__uuidof(struct_with_uuid)> COM_TYPE_1; // expected-warning {{non-type template argument containing a dereference operation is a Microsoft extension}}
106a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichettypedef COM_CLASS_TEMPLATE<struct_with_uuid> COM_TYPE_2;
107a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichet
108a343a415035aba553a5c21fad8fba6a6db83e0f9Francois Pichettemplate <class T, const GUID& g>
109a343a415035aba553a5c21fad8fba6a6db83e0f9Francois Pichetclass COM_CLASS_TEMPLATE_REF  { };
110e275a1845b9e32bd3034f2593dee1780855c8fd6Francois Pichettypedef COM_CLASS_TEMPLATE_REF<struct_with_uuid, __uuidof(struct_with_uuid)> COM_TYPE_REF;
111a97d24f2ca50f318f62a6cf2a621e7842dd63b4aFrancois Pichet
11220e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  struct late_defined_uuid;
11320e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  template<typename T>
11420e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  void test_late_defined_uuid() {
11520e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet    __uuidof(late_defined_uuid);
11620e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  }
11720e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  struct __declspec(uuid("000000A0-0000-0000-C000-000000000049")) late_defined_uuid;
11820e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet
119d1282ec56231c967439c1eb67fe4afe792287911David MajnemerCOM_CLASS_TEMPLATE_REF<int, __uuidof(struct_with_uuid)> good_template_arg;
120d1282ec56231c967439c1eb67fe4afe792287911David Majnemer
121ef8225444452a1486bd721f3285301fe84643b00Stephen HinesCOM_CLASS_TEMPLATE<int, __uuidof(struct_with_uuid)> bad_template_arg; // expected-error {{non-type template argument of type 'const _GUID' cannot be converted to a value of type 'const GUID *' (aka 'const _GUID *')}}
122dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
12329b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemernamespace PR16911 {
12429b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerstruct __declspec(uuid("{12345678-1234-1234-1234-1234567890aB}")) uuid;
12529b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerstruct __declspec(uuid("{12345678-1234-1234-1234-1234567890aB}")) uuid2;
12629b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer
12729b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemertemplate <typename T, typename T2>
12829b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerstruct thing {
12929b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer};
13029b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer
13129b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerstruct empty {};
13229b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerstruct inher : public thing<empty, uuid2> {};
13329b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer
13429b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerstruct __declspec(uuid("{12345678-1234-1234-1234-1234567890aB}")) uuid;
13529b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerconst struct _GUID *w = &__uuidof(inher); // expected-error{{cannot call operator __uuidof on a type with no GUID}}
13629b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerconst struct _GUID *x = &__uuidof(thing<uuid, inher>);
13729b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerconst struct _GUID *y = &__uuidof(thing<uuid2, uuid>); // expected-error{{cannot call operator __uuidof on a type with multiple GUIDs}}
13829b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerthing<uuid2, uuid> thing_obj = thing<uuid2, uuid>();
13929b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemerconst struct _GUID *z = &__uuidof(thing_obj); // expected-error{{cannot call operator __uuidof on a type with multiple GUIDs}}
14029b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer}
14129b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer
1423cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballmanclass CtorCall {
143dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichetpublic:
144dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet  CtorCall& operator=(const CtorCall& that);
145dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
146dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet  int a;
147dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet};
148dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
149dbee3411a22b0dbb03267f5445f7b796104991bbFrancois PichetCtorCall& CtorCall::operator=(const CtorCall& that)
150dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet{
151dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    if (this != &that) {
152dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet        this->CtorCall::~CtorCall();
153dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet        this->CtorCall::CtorCall(that); // expected-warning {{explicit constructor calls are a Microsoft extension}}
154dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    }
155dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    return *this;
156dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet}
1574147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1584147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate <class A>
1594147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetclass C1 {
1604147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetpublic:
1614147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  template <int B>
1624147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  class Iterator {
1634147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  };
1644147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet};
1653cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman
1664147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate<class T>
1674147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetclass C2  {
1684147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  typename C1<T>:: /*template*/  Iterator<0> Mypos; // expected-warning {{use 'template' keyword to treat 'Iterator' as a dependent template name}}
1694147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet};
1704147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1714147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate <class T>
17220e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichetvoid missing_template_keyword(){
1734147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  typename C1<T>:: /*template*/ Iterator<0> Mypos; // expected-warning {{use 'template' keyword to treat 'Iterator' as a dependent template name}}
1744147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet}
1754147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
176a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet
177a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet
17867ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemerclass AAAA {
17967ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemer   typedef int D;
18067ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemer};
181a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet
18223756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smithtemplate <typename T>
18323756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smithclass SimpleTemplate {};
18423756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith
185a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichettemplate <class T>
186a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichetvoid redundant_typename() {
187a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet   typename T t;// expected-warning {{expected a qualified name after 'typename'}}
188a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet   typename AAAA a;// expected-warning {{expected a qualified name after 'typename'}}
18923756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith
190a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet   t = 3;
1913cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman
19223756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith   typedef typename T* pointerT;// expected-warning {{expected a qualified name after 'typename'}}
19323756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith   typedef typename SimpleTemplate<int> templateT;// expected-warning {{expected a qualified name after 'typename'}}
19423756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith
19523756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith   pointerT pT = &t;
19623756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith   *pT = 4;
19723756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith
19823756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith   int var;
19923756776eadfd8bbddf5d120d4c191ef9e50d209Richard Smith   int k = typename var;// expected-error {{expected a qualified name after 'typename'}}
200a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet}
201a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet
20267ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemertemplate <typename T>
20367ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemerstruct TypenameWrongPlace {
20467ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemer  typename typedef T::D D;// expected-warning {{expected a qualified name after 'typename'}}
20567ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemer};
20667ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemer
20767ac9989e3ec53174b524ab8bc7d08185346caceDavid Majnemerextern TypenameWrongPlace<AAAA> PR16925;
20817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos
20917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos__interface MicrosoftInterface;
21017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos__interface MicrosoftInterface {
21117d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos   void foo1() = 0;
21217d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos   virtual void foo2() = 0;
21317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos};
21417d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos
21517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos__interface MicrosoftDerivedInterface : public MicrosoftInterface {
21617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  void foo1();
21717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  void foo2() override;
21817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  void foo3();
21917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos};
22017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos
22117d35c36fbae764fcd68fa8b31624078a033aabcJoao Matosvoid interface_test() {
22217d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  MicrosoftInterface* a;
22317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  a->foo1();
22417d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  MicrosoftDerivedInterface* b;
22517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  b->foo2();
22617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos}
22717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos
22817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos__int64 x7 = __int64(0);
2291e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet
230a23ae3f45789f40cdfd939117284f977d2dc17a6Francois Pichetint __identifier(generic) = 3;
231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint __identifier(int) = 4;
232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct __identifier(class) { __identifier(class) *__identifier(for); };
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__identifier(class) __identifier(struct) = { &__identifier(struct) };
234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint __identifier for; // expected-error {{missing '(' after '__identifier'}}
236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint __identifier(else} = __identifier(for); // expected-error {{missing ')' after identifier}} expected-note {{to match this '('}}
237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define identifier_weird(x) __identifier(x
238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint k = identifier_weird(if)); // expected-error {{use of undeclared identifier 'if'}}
239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This is a bit weird, but the alternative tokens aren't keywords, and this
241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// behavior matches MSVC. FIXME: Consider supporting this anyway.
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern int __identifier(and) r; // expected-error {{cannot convert '&&' token to an identifier}}
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid f() {
245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  __identifier(() // expected-error {{cannot convert '(' token to an identifier}}
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  __identifier(void) // expected-error {{use of undeclared identifier 'void'}}
247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  __identifier()) // expected-error {{cannot convert ')' token to an identifier}}
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: We should pick a friendlier display name for this token kind.
249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  __identifier(1) // expected-error {{cannot convert <numeric_constant> token to an identifier}}
250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  __identifier(+) // expected-error {{cannot convert '+' token to an identifier}}
251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  __identifier("foo") // expected-error {{cannot convert <string_literal> token to an identifier}}
252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  __identifier(;) // expected-error {{cannot convert ';' token to an identifier}}
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
254a23ae3f45789f40cdfd939117284f977d2dc17a6Francois Pichet
2556a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichetclass inline_definition_pure_spec {
2566a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet   virtual int f() = 0 { return 0; }// expected-warning {{function definition with pure-specifier is a Microsoft extension}}
2576a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet   virtual int f2() = 0;
2586a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet};
2596a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet
2605dbed6674bda07dd147183932bc843c52205633fReid Klecknerstruct pure_virtual_dtor {
2615dbed6674bda07dd147183932bc843c52205633fReid Kleckner  virtual ~pure_virtual_dtor() = 0;
2625dbed6674bda07dd147183932bc843c52205633fReid Kleckner};
2635dbed6674bda07dd147183932bc843c52205633fReid Klecknerpure_virtual_dtor::~pure_virtual_dtor() { }
2645dbed6674bda07dd147183932bc843c52205633fReid Kleckner
2655dbed6674bda07dd147183932bc843c52205633fReid Klecknerstruct pure_virtual_dtor_inline {
2665dbed6674bda07dd147183932bc843c52205633fReid Kleckner  virtual ~pure_virtual_dtor_inline() = 0 { }// expected-warning {{function definition with pure-specifier is a Microsoft extension}}
2675dbed6674bda07dd147183932bc843c52205633fReid Kleckner};
2685dbed6674bda07dd147183932bc843c52205633fReid Kleckner
26920e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet
27020e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichetint main () {
27120e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  // Necessary to force instantiation in -fdelayed-template-parsing mode.
2723cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballman  test_late_defined_uuid<int>();
27320e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  redundant_typename<int>();
27420e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet  missing_template_keyword<int>();
27520e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet}
27620e3c9ed21b47c3b6d1d82df84db357600bacc06Francois Pichet
2776c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCallnamespace access_protected_PTM {
2786c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  class A {
2796c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  protected:
2806c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall    void f(); // expected-note {{must name member using the type of the current context 'access_protected_PTM::B'}}
2816c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  };
282b2d899e9ae8a48c4057a48664213948934b877faFrancois Pichet
2836c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  class B : public A{
2846c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  public:
2856c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall    void test_access();
2866c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall    static void test_access_static();
2876c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  };
288b2d899e9ae8a48c4057a48664213948934b877faFrancois Pichet
2896c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  void B::test_access() {
2906c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall    &A::f; // expected-error {{'f' is a protected member of 'access_protected_PTM::A'}}
2916c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  }
2926c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall
2936c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  void B::test_access_static() {
2946c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall    &A::f;
2956c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall  }
2966c20222da814df4cb1ef97681f0e1e8cb5a01b40John McCall}
297c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall
298c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCallnamespace Inheritance {
299c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall  class __single_inheritance A;
300c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall  class __multiple_inheritance B;
301c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall  class __virtual_inheritance C;
302c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall}
30376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
30476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct StructWithProperty {
30576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property) int V0; // expected-error {{expected '(' after 'property'}}
30676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property()) int V1; // expected-error {{property does not specify a getter or a putter}}
30776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(set)) int V2; // expected-error {{putter for property must be specified as 'put', not 'set'}} expected-error {{expected '=' after 'set'}}
30876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(ptu)) int V3; // expected-error {{missing 'get=' or 'put='}}
30976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(ptu=PutV)) int V4; // expected-error {{expected 'get' or 'put' in property declaration}}
31076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get)) int V5; // expected-error {{expected '=' after 'get'}}
31176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get&)) int V6; // expected-error {{expected '=' after 'get'}}
31276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=)) int V7; // expected-error {{expected name of accessor method}}
31376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV)) int V8; // no-warning
31476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV=)) int V9; // expected-error {{expected ',' or ')' at end of property accessor list}}
31576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV,)) int V10; // expected-error {{expected 'get' or 'put' in property declaration}}
31676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV,put=SetV)) int V11; // no-warning
31776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV,put=SetV,get=GetV)) int V12; // expected-error {{property declaration specifies 'get' accessor twice}}
31876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
31976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int GetV() { return 123; }
32076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void SetV(int v) {}
32176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
32276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid TestProperty() {
32376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  StructWithProperty sp;
32476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  sp.V8;
32576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  sp.V8 = 0; // expected-error {{no setter defined for property 'V8'}}
32676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int i = sp.V11;
32776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  sp.V11 = i++;
32876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  sp.V11 += 8;
32976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  sp.V11++;
33076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  ++sp.V11;
33176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}
332ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
333ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//expected-warning@+1 {{C++ operator 'and' (aka '&&') used as a macro name}}
334ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#define and foo
335ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
336ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(uuid("00000000-0000-0000-C000-000000000046")) __declspec(novtable) IUnknown {}; // expected-warning{{__declspec attribute 'novtable' is not supported}}
337ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
338ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestypedef bool (__stdcall __stdcall *blarg)(int);
339ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
340ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid local_callconv() {
341ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool (__stdcall *p)(int);
342ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
343ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
344ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct S7 {
345ef8225444452a1486bd721f3285301fe84643b00Stephen Hines	int foo() { return 12; }
346ef8225444452a1486bd721f3285301fe84643b00Stephen Hines	__declspec(property(get=foo) deprecated) int t; // expected-note {{'t' has been explicitly marked deprecated here}}
347ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
348ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
349ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Technically, this is legal (though it does nothing)
350ef8225444452a1486bd721f3285301fe84643b00Stephen Hines__declspec() void quux( void ) {
351ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct S7 s;
352ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int i = s.t;	// expected-warning {{'t' is deprecated}}
353ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
354ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
355ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid *_alloca(int);
356ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
357ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid foo(void) {
358ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  __declspec(align(16)) int *buffer = (int *)_alloca(9);
359ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
360