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