MicrosoftExtensions.cpp revision 1e862693c63067ae467b0b3884c44f753cd6e821
1913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet// RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-extensions 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 108dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet 109dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichetclass CtorCall { 110dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichetpublic: 111dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet CtorCall& operator=(const CtorCall& that); 112dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet 113dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet int a; 114dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet}; 115dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet 116dbee3411a22b0dbb03267f5445f7b796104991bbFrancois PichetCtorCall& CtorCall::operator=(const CtorCall& that) 117dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet{ 118dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet if (this != &that) { 119dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet this->CtorCall::~CtorCall(); 120dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet this->CtorCall::CtorCall(that); // expected-warning {{explicit constructor calls are a Microsoft extension}} 121dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet } 122dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet return *this; 123dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet} 1244147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet 1254147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate <class A> 1264147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetclass C1 { 1274147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetpublic: 1284147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet template <int B> 1294147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet class Iterator { 1304147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet }; 1314147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet}; 1324147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet 1334147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate<class T> 1344147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetclass C2 { 1354147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet typename C1<T>:: /*template*/ Iterator<0> Mypos; // expected-warning {{use 'template' keyword to treat 'Iterator' as a dependent template name}} 1364147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet}; 1374147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet 1384147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate <class T> 1394147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetvoid f(){ 1404147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet typename C1<T>:: /*template*/ Iterator<0> Mypos; // expected-warning {{use 'template' keyword to treat 'Iterator' as a dependent template name}} 1414147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet} 1424147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet 143a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet 144a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet 145a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichetclass AAAA { }; 146a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet 147a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichettemplate <class T> 148a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichetvoid redundant_typename() { 149a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet typename T t;// expected-warning {{expected a qualified name after 'typename'}} 150a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet typename AAAA a;// expected-warning {{expected a qualified name after 'typename'}} 151a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet t = 3; 152a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet} 153a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet 1544147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetint main() { 155a5d318ad4ad3a110b3abb34f765e69b76f7c0bcdFrancois Pichet redundant_typename<int>(); 1564147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet f<int>(); 1574147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet} 1584147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet 1594147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet 1600047012d99e9f80e242f9dbbc374049d478ffc6fFrancois Pichet__interface MicrosoftInterface; 1610047012d99e9f80e242f9dbbc374049d478ffc6fFrancois Pichet__interface MicrosoftInterface { 1620047012d99e9f80e242f9dbbc374049d478ffc6fFrancois Pichet virtual void foo1() = 0; 1630047012d99e9f80e242f9dbbc374049d478ffc6fFrancois Pichet virtual void foo2() = 0; 164338d7f7362d18fa9c39c6bb5282b4e20574a9309Francois Pichet}; 165338d7f7362d18fa9c39c6bb5282b4e20574a9309Francois Pichet 166338d7f7362d18fa9c39c6bb5282b4e20574a9309Francois Pichet__int64 x7 = __int64(0); 1671e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1681e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1691e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1701e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1711e862693c63067ae467b0b3884c44f753cd6e821Francois Pichetclass IF_EXISTS { 1721e862693c63067ae467b0b3884c44f753cd6e821Francois Pichetprivate: 1731e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet typedef int Type; 1741e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet}; 1751e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1761e862693c63067ae467b0b3884c44f753cd6e821Francois Pichetint __if_exists_test() { 1771e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1781e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet int b=0; 1791e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1801e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1811e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet __if_exists(IF_EXISTS::Type) { 1821e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet b++; 1831e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet b++; 1841e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet } 1851e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1861e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet __if_exists(IF_EXISTS::Type_not) { 1871e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet this wont compile. 1881e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet } 1891e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1901e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet __if_not_exists(IF_EXISTS::Type) { 1911e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet this wont compile. 1921e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet } 1931e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1941e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet __if_not_exists(IF_EXISTS::Type_not) { 1951e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet b++; 1961e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet b++; 1971e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet } 1981e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet 1991e862693c63067ae467b0b3884c44f753cd6e821Francois Pichet} 200