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