1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -std=c++11 -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s 2*0a6a1f1dSLionel Sambuc 3*0a6a1f1dSLionel Sambuc namespace FTypeWithQuals { 4*0a6a1f1dSLionel Sambuc template <typename T> 5*0a6a1f1dSLionel Sambuc struct S {}; 6*0a6a1f1dSLionel Sambuc 7*0a6a1f1dSLionel Sambuc using A = int () const; 8*0a6a1f1dSLionel Sambuc S<A> a; 9*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?a@FTypeWithQuals@@3U?$S@$$A8@@BAHXZ@1@A" 10*0a6a1f1dSLionel Sambuc 11*0a6a1f1dSLionel Sambuc using B = int () volatile; 12*0a6a1f1dSLionel Sambuc S<B> b; 13*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?b@FTypeWithQuals@@3U?$S@$$A8@@CAHXZ@1@A" 14*0a6a1f1dSLionel Sambuc 15*0a6a1f1dSLionel Sambuc using C = int () __restrict; 16*0a6a1f1dSLionel Sambuc S<C> c; 17*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?c@FTypeWithQuals@@3U?$S@$$A8@@IAAHXZ@1@A" 18*0a6a1f1dSLionel Sambuc 19*0a6a1f1dSLionel Sambuc using D = int () const &; 20*0a6a1f1dSLionel Sambuc S<D> d; 21*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?d@FTypeWithQuals@@3U?$S@$$A8@@GBAHXZ@1@A" 22*0a6a1f1dSLionel Sambuc 23*0a6a1f1dSLionel Sambuc using E = int () volatile &; 24*0a6a1f1dSLionel Sambuc S<E> e; 25*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?e@FTypeWithQuals@@3U?$S@$$A8@@GCAHXZ@1@A" 26*0a6a1f1dSLionel Sambuc 27*0a6a1f1dSLionel Sambuc using F = int () __restrict &; 28*0a6a1f1dSLionel Sambuc S<F> f; 29*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?f@FTypeWithQuals@@3U?$S@$$A8@@IGAAHXZ@1@A" 30*0a6a1f1dSLionel Sambuc 31*0a6a1f1dSLionel Sambuc using G = int () const &&; 32*0a6a1f1dSLionel Sambuc S<G> g; 33*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?g@FTypeWithQuals@@3U?$S@$$A8@@HBAHXZ@1@A" 34*0a6a1f1dSLionel Sambuc 35*0a6a1f1dSLionel Sambuc using H = int () volatile &&; 36*0a6a1f1dSLionel Sambuc S<H> h; 37*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?h@FTypeWithQuals@@3U?$S@$$A8@@HCAHXZ@1@A" 38*0a6a1f1dSLionel Sambuc 39*0a6a1f1dSLionel Sambuc using I = int () __restrict &&; 40*0a6a1f1dSLionel Sambuc S<I> i; 41*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?i@FTypeWithQuals@@3U?$S@$$A8@@IHAAHXZ@1@A" 42*0a6a1f1dSLionel Sambuc 43*0a6a1f1dSLionel Sambuc using J = int (); 44*0a6a1f1dSLionel Sambuc S<J> j; 45*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?j@FTypeWithQuals@@3U?$S@$$A6AHXZ@1@A" 46*0a6a1f1dSLionel Sambuc 47*0a6a1f1dSLionel Sambuc using K = int () &; 48*0a6a1f1dSLionel Sambuc S<K> k; 49*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?k@FTypeWithQuals@@3U?$S@$$A8@@GAAHXZ@1@A" 50*0a6a1f1dSLionel Sambuc 51*0a6a1f1dSLionel Sambuc using L = int () &&; 52*0a6a1f1dSLionel Sambuc S<L> l; 53*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?l@FTypeWithQuals@@3U?$S@$$A8@@HAAHXZ@1@A" 54*0a6a1f1dSLionel Sambuc } 55*0a6a1f1dSLionel Sambuc 56*0a6a1f1dSLionel Sambuc // CHECK: "\01?DeducedType@@3HA" 57*0a6a1f1dSLionel Sambuc auto DeducedType = 30; 58*0a6a1f1dSLionel Sambuc 59*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?Char16Var@@3_SA" 60*0a6a1f1dSLionel Sambuc char16_t Char16Var; 61*0a6a1f1dSLionel Sambuc 62*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?Char32Var@@3_UA" 63*0a6a1f1dSLionel Sambuc char32_t Char32Var; 64f4a2713aSLionel Sambuc 65f4a2713aSLionel Sambuc // CHECK: "\01?LRef@@YAXAAH@Z" LRef(int & a)66f4a2713aSLionel Sambucvoid LRef(int& a) { } 67f4a2713aSLionel Sambuc 68f4a2713aSLionel Sambuc // CHECK: "\01?RRef@@YAH$$QAH@Z" RRef(int && a)69f4a2713aSLionel Sambucint RRef(int&& a) { return a; } 70f4a2713aSLionel Sambuc 71f4a2713aSLionel Sambuc // CHECK: "\01?Null@@YAX$$T@Z" 72f4a2713aSLionel Sambuc namespace std { typedef decltype(__nullptr) nullptr_t; } Null(std::nullptr_t)73f4a2713aSLionel Sambucvoid Null(std::nullptr_t) {} 74*0a6a1f1dSLionel Sambuc 75*0a6a1f1dSLionel Sambuc namespace EnumMangling { 76*0a6a1f1dSLionel Sambuc extern enum Enum01 { } Enum; 77*0a6a1f1dSLionel Sambuc extern enum Enum02 : bool { } BoolEnum; 78*0a6a1f1dSLionel Sambuc extern enum Enum03 : char { } CharEnum; 79*0a6a1f1dSLionel Sambuc extern enum Enum04 : signed char { } SCharEnum; 80*0a6a1f1dSLionel Sambuc extern enum Enum05 : unsigned char { } UCharEnum; 81*0a6a1f1dSLionel Sambuc extern enum Enum06 : short { } SShortEnum; 82*0a6a1f1dSLionel Sambuc extern enum Enum07 : unsigned short { } UShortEnum; 83*0a6a1f1dSLionel Sambuc extern enum Enum08 : int { } SIntEnum; 84*0a6a1f1dSLionel Sambuc extern enum Enum09 : unsigned int { } UIntEnum; 85*0a6a1f1dSLionel Sambuc extern enum Enum10 : long { } SLongEnum; 86*0a6a1f1dSLionel Sambuc extern enum Enum11 : unsigned long { } ULongEnum; 87*0a6a1f1dSLionel Sambuc extern enum Enum12 : long long { } SLongLongEnum; 88*0a6a1f1dSLionel Sambuc extern enum Enum13 : unsigned long long { } ULongLongEnum; 89*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?Enum@EnumMangling@@3W4Enum01@1@A" 90*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?BoolEnum@EnumMangling@@3W4Enum02@1@A 91*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?CharEnum@EnumMangling@@3W4Enum03@1@A 92*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SCharEnum@EnumMangling@@3W4Enum04@1@A 93*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?UCharEnum@EnumMangling@@3W4Enum05@1@A 94*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SShortEnum@EnumMangling@@3W4Enum06@1@A" 95*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?UShortEnum@EnumMangling@@3W4Enum07@1@A" 96*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SIntEnum@EnumMangling@@3W4Enum08@1@A" 97*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?UIntEnum@EnumMangling@@3W4Enum09@1@A" 98*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SLongEnum@EnumMangling@@3W4Enum10@1@A" 99*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?ULongEnum@EnumMangling@@3W4Enum11@1@A" 100*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SLongLongEnum@EnumMangling@@3W4Enum12@1@A" 101*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?ULongLongEnum@EnumMangling@@3W4Enum13@1@A" UseEnum()102*0a6a1f1dSLionel Sambuc decltype(Enum) *UseEnum() { return &Enum; } UseBoolEnum()103*0a6a1f1dSLionel Sambuc decltype(BoolEnum) *UseBoolEnum() { return &BoolEnum; } UseCharEnum()104*0a6a1f1dSLionel Sambuc decltype(CharEnum) *UseCharEnum() { return &CharEnum; } UseSCharEnum()105*0a6a1f1dSLionel Sambuc decltype(SCharEnum) *UseSCharEnum() { return &SCharEnum; } UseUCharEnum()106*0a6a1f1dSLionel Sambuc decltype(UCharEnum) *UseUCharEnum() { return &UCharEnum; } UseSShortEnum()107*0a6a1f1dSLionel Sambuc decltype(SShortEnum) *UseSShortEnum() { return &SShortEnum; } UseUShortEnum()108*0a6a1f1dSLionel Sambuc decltype(UShortEnum) *UseUShortEnum() { return &UShortEnum; } UseSIntEnum()109*0a6a1f1dSLionel Sambuc decltype(SIntEnum) *UseSIntEnum() { return &SIntEnum; } UseUIntEnum()110*0a6a1f1dSLionel Sambuc decltype(UIntEnum) *UseUIntEnum() { return &UIntEnum; } UseSLongEnum()111*0a6a1f1dSLionel Sambuc decltype(SLongEnum) *UseSLongEnum() { return &SLongEnum; } UseULongEnum()112*0a6a1f1dSLionel Sambuc decltype(ULongEnum) *UseULongEnum() { return &ULongEnum; } UseSLongLongEnum()113*0a6a1f1dSLionel Sambuc decltype(SLongLongEnum) *UseSLongLongEnum() { return &SLongLongEnum; } UseULongLongEnum()114*0a6a1f1dSLionel Sambuc decltype(ULongLongEnum) *UseULongLongEnum() { return &ULongLongEnum; } 115*0a6a1f1dSLionel Sambuc extern enum class EnumClass01 { } EnumClass; 116*0a6a1f1dSLionel Sambuc extern enum class EnumClass02 : bool { } BoolEnumClass; 117*0a6a1f1dSLionel Sambuc extern enum class EnumClass03 : char { } CharEnumClass; 118*0a6a1f1dSLionel Sambuc extern enum class EnumClass04 : signed char { } SCharEnumClass; 119*0a6a1f1dSLionel Sambuc extern enum class EnumClass05 : unsigned char { } UCharEnumClass; 120*0a6a1f1dSLionel Sambuc extern enum class EnumClass06 : short { } SShortEnumClass; 121*0a6a1f1dSLionel Sambuc extern enum class EnumClass07 : unsigned short { } UShortEnumClass; 122*0a6a1f1dSLionel Sambuc extern enum class EnumClass08 : int { } SIntEnumClass; 123*0a6a1f1dSLionel Sambuc extern enum class EnumClass09 : unsigned int { } UIntEnumClass; 124*0a6a1f1dSLionel Sambuc extern enum class EnumClass10 : long { } SLongEnumClass; 125*0a6a1f1dSLionel Sambuc extern enum class EnumClass11 : unsigned long { } ULongEnumClass; 126*0a6a1f1dSLionel Sambuc extern enum class EnumClass12 : long long { } SLongLongEnumClass; 127*0a6a1f1dSLionel Sambuc extern enum class EnumClass13 : unsigned long long { } ULongLongEnumClass; 128*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?EnumClass@EnumMangling@@3W4EnumClass01@1@A" 129*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?BoolEnumClass@EnumMangling@@3W4EnumClass02@1@A 130*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?CharEnumClass@EnumMangling@@3W4EnumClass03@1@A 131*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SCharEnumClass@EnumMangling@@3W4EnumClass04@1@A 132*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?UCharEnumClass@EnumMangling@@3W4EnumClass05@1@A 133*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SShortEnumClass@EnumMangling@@3W4EnumClass06@1@A" 134*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?UShortEnumClass@EnumMangling@@3W4EnumClass07@1@A" 135*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SIntEnumClass@EnumMangling@@3W4EnumClass08@1@A" 136*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?UIntEnumClass@EnumMangling@@3W4EnumClass09@1@A" 137*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SLongEnumClass@EnumMangling@@3W4EnumClass10@1@A" 138*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?ULongEnumClass@EnumMangling@@3W4EnumClass11@1@A" 139*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?SLongLongEnumClass@EnumMangling@@3W4EnumClass12@1@A" 140*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?ULongLongEnumClass@EnumMangling@@3W4EnumClass13@1@A" UseEnumClass()141*0a6a1f1dSLionel Sambuc decltype(EnumClass) *UseEnumClass() { return &EnumClass; } UseBoolEnumClass()142*0a6a1f1dSLionel Sambuc decltype(BoolEnumClass) *UseBoolEnumClass() { return &BoolEnumClass; } UseCharEnumClass()143*0a6a1f1dSLionel Sambuc decltype(CharEnumClass) *UseCharEnumClass() { return &CharEnumClass; } UseSCharEnumClass()144*0a6a1f1dSLionel Sambuc decltype(SCharEnumClass) *UseSCharEnumClass() { return &SCharEnumClass; } UseUCharEnumClass()145*0a6a1f1dSLionel Sambuc decltype(UCharEnumClass) *UseUCharEnumClass() { return &UCharEnumClass; } UseSShortEnumClass()146*0a6a1f1dSLionel Sambuc decltype(SShortEnumClass) *UseSShortEnumClass() { return &SShortEnumClass; } UseUShortEnumClass()147*0a6a1f1dSLionel Sambuc decltype(UShortEnumClass) *UseUShortEnumClass() { return &UShortEnumClass; } UseSIntEnumClass()148*0a6a1f1dSLionel Sambuc decltype(SIntEnumClass) *UseSIntEnumClass() { return &SIntEnumClass; } UseUIntEnumClass()149*0a6a1f1dSLionel Sambuc decltype(UIntEnumClass) *UseUIntEnumClass() { return &UIntEnumClass; } UseSLongEnumClass()150*0a6a1f1dSLionel Sambuc decltype(SLongEnumClass) *UseSLongEnumClass() { return &SLongEnumClass; } UseULongEnumClass()151*0a6a1f1dSLionel Sambuc decltype(ULongEnumClass) *UseULongEnumClass() { return &ULongEnumClass; } UseSLongLongEnumClass()152*0a6a1f1dSLionel Sambuc decltype(SLongLongEnumClass) *UseSLongLongEnumClass() { return &SLongLongEnumClass; } UseULongLongEnumClass()153*0a6a1f1dSLionel Sambuc decltype(ULongLongEnumClass) *UseULongLongEnumClass() { return &ULongLongEnumClass; } 154*0a6a1f1dSLionel Sambuc } 155*0a6a1f1dSLionel Sambuc 156*0a6a1f1dSLionel Sambuc namespace PR18022 { 157*0a6a1f1dSLionel Sambuc 158*0a6a1f1dSLionel Sambuc struct { } a; fun(decltype(a) x,decltype(a) )159*0a6a1f1dSLionel Sambucdecltype(a) fun(decltype(a) x, decltype(a)) { return x; } 160*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?fun@PR18022@@YA?AU<unnamed-type-a>@1@U21@0@Z" 161*0a6a1f1dSLionel Sambuc 162*0a6a1f1dSLionel Sambuc } 163*0a6a1f1dSLionel Sambuc define_lambda()164*0a6a1f1dSLionel Sambucinline int define_lambda() { 165*0a6a1f1dSLionel Sambuc static auto lambda = [] { static int local; ++local; return local; }; 166*0a6a1f1dSLionel Sambuc // First, we have the static local variable of type "<lambda_1>" inside of 167*0a6a1f1dSLionel Sambuc // "define_lambda". 168*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?lambda@?1??define_lambda@@YAHXZ@4V<lambda_1>@?1@YAHXZ@A" 169*0a6a1f1dSLionel Sambuc // Next, we have the "operator()" for "<lambda_1>" which is inside of 170*0a6a1f1dSLionel Sambuc // "define_lambda". 171*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01??R<lambda_1>@?define_lambda@@YAHXZ@QBEHXZ" 172*0a6a1f1dSLionel Sambuc // Finally, we have the local which is inside of "<lambda_1>" which is inside of 173*0a6a1f1dSLionel Sambuc // "define_lambda". Hooray. 174*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?local@?2???R<lambda_1>@?define_lambda@@YAHXZ@QBEHXZ@4HA" 175*0a6a1f1dSLionel Sambuc return lambda(); 176*0a6a1f1dSLionel Sambuc } 177*0a6a1f1dSLionel Sambuc 178*0a6a1f1dSLionel Sambuc template <typename T> use_lambda_arg(T)179*0a6a1f1dSLionel Sambucvoid use_lambda_arg(T) {} 180*0a6a1f1dSLionel Sambuc call_with_lambda_arg1()181*0a6a1f1dSLionel Sambucinline void call_with_lambda_arg1() { 182*0a6a1f1dSLionel Sambuc use_lambda_arg([]{}); 183*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01??$use_lambda_arg@V<lambda_1>@?call_with_lambda_arg1@@YAXXZ@@@YAXV<lambda_1>@?call_with_lambda_arg1@@YAXXZ@@Z" 184*0a6a1f1dSLionel Sambuc } 185*0a6a1f1dSLionel Sambuc call_with_lambda_arg2()186*0a6a1f1dSLionel Sambucinline void call_with_lambda_arg2() { 187*0a6a1f1dSLionel Sambuc use_lambda_arg([]{}); 188*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01??$use_lambda_arg@V<lambda_1>@?call_with_lambda_arg2@@YAXXZ@@@YAXV<lambda_1>@?call_with_lambda_arg2@@YAXXZ@@Z" 189*0a6a1f1dSLionel Sambuc } 190*0a6a1f1dSLionel Sambuc call_lambda()191*0a6a1f1dSLionel Sambucint call_lambda() { 192*0a6a1f1dSLionel Sambuc call_with_lambda_arg1(); 193*0a6a1f1dSLionel Sambuc call_with_lambda_arg2(); 194*0a6a1f1dSLionel Sambuc return define_lambda(); 195*0a6a1f1dSLionel Sambuc } 196*0a6a1f1dSLionel Sambuc 197*0a6a1f1dSLionel Sambuc namespace PR19361 { 198*0a6a1f1dSLionel Sambuc struct A { 199*0a6a1f1dSLionel Sambuc void foo() __restrict &; 200*0a6a1f1dSLionel Sambuc void foo() __restrict &&; 201*0a6a1f1dSLionel Sambuc }; foo()202*0a6a1f1dSLionel Sambucvoid A::foo() __restrict & {} 203*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?foo@A@PR19361@@QIGAEXXZ" foo()204*0a6a1f1dSLionel Sambucvoid A::foo() __restrict && {} 205*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01?foo@A@PR19361@@QIHAEXXZ" 206*0a6a1f1dSLionel Sambuc } 207*0a6a1f1dSLionel Sambuc operator ""_deg(long double)208*0a6a1f1dSLionel Sambucint operator"" _deg(long double) { return 0; } 209*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01??__K_deg@@YAHO@Z" 210*0a6a1f1dSLionel Sambuc 211*0a6a1f1dSLionel Sambuc template <char...> templ_fun_with_pack()212*0a6a1f1dSLionel Sambucvoid templ_fun_with_pack() {} 213*0a6a1f1dSLionel Sambuc 214*0a6a1f1dSLionel Sambuc template void templ_fun_with_pack<>(); 215*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01??$templ_fun_with_pack@$S@@YAXXZ" 216*0a6a1f1dSLionel Sambuc 217*0a6a1f1dSLionel Sambuc template <typename...> templ_fun_with_ty_pack()218*0a6a1f1dSLionel Sambucvoid templ_fun_with_ty_pack() {} 219*0a6a1f1dSLionel Sambuc 220*0a6a1f1dSLionel Sambuc template void templ_fun_with_ty_pack<>(); 221*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01??$templ_fun_with_ty_pack@$$V@@YAXXZ" 222*0a6a1f1dSLionel Sambuc 223*0a6a1f1dSLionel Sambuc template <template <class> class...> templ_fun_with_templ_templ_pack()224*0a6a1f1dSLionel Sambucvoid templ_fun_with_templ_templ_pack() {} 225*0a6a1f1dSLionel Sambuc 226*0a6a1f1dSLionel Sambuc template void templ_fun_with_templ_templ_pack<>(); 227*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01??$templ_fun_with_templ_templ_pack@$$V@@YAXXZ" 228*0a6a1f1dSLionel Sambuc 229*0a6a1f1dSLionel Sambuc namespace PR20047 { 230*0a6a1f1dSLionel Sambuc template <typename T> 231*0a6a1f1dSLionel Sambuc struct A {}; 232*0a6a1f1dSLionel Sambuc 233*0a6a1f1dSLionel Sambuc template <typename T> 234*0a6a1f1dSLionel Sambuc using AliasA = A<T>; 235*0a6a1f1dSLionel Sambuc 236*0a6a1f1dSLionel Sambuc template <template <typename> class> f()237*0a6a1f1dSLionel Sambucvoid f() {} 238*0a6a1f1dSLionel Sambuc 239*0a6a1f1dSLionel Sambuc template void f<AliasA>(); 240*0a6a1f1dSLionel Sambuc // CHECK-DAG: @"\01??$f@$$YAliasA@PR20047@@@PR20047@@YAXXZ" 241*0a6a1f1dSLionel Sambuc } 242