1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 2a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregortemplate<int I, int J> 3a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregorstruct Bitfields { 4a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregor int simple : I; // expected-error{{bit-field 'simple' has zero width}} 5a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregor int parens : (J); 6a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregor}; 7a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregor 8a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregorvoid test_Bitfields(Bitfields<0, 5> *b) { 9a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregor (void)sizeof(Bitfields<10, 5>); 107c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)sizeof(Bitfields<0, 1>); // expected-note{{in instantiation of template class 'Bitfields<0, 1>' requested here}} 11a0e500db61f5fcf3ff6de6af1494f0cea9f6f8dbDouglas Gregor} 12df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor 13df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregortemplate<int I, int J> 14df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregorstruct BitfieldPlus { 15df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor int bitfield : I + J; // expected-error{{bit-field 'bitfield' has zero width}} 16df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor}; 17df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor 18df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregorvoid test_BitfieldPlus() { 19df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor (void)sizeof(BitfieldPlus<0, 1>); 207c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)sizeof(BitfieldPlus<-5, 5>); // expected-note{{in instantiation of template class 'BitfieldPlus<-5, 5>' requested here}} 21df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor} 22df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor 23df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregortemplate<int I, int J> 24df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregorstruct BitfieldMinus { 25df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor int bitfield : I - J; // expected-error{{bit-field 'bitfield' has negative width (-1)}} \ 26df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor // expected-error{{bit-field 'bitfield' has zero width}} 27df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor}; 28df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor 29df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregorvoid test_BitfieldMinus() { 30df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor (void)sizeof(BitfieldMinus<5, 1>); 317c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)sizeof(BitfieldMinus<0, 1>); // expected-note{{in instantiation of template class 'BitfieldMinus<0, 1>' requested here}} 327c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)sizeof(BitfieldMinus<5, 5>); // expected-note{{in instantiation of template class 'BitfieldMinus<5, 5>' requested here}} 33df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor} 34df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor 35df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregortemplate<int I, int J> 36df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregorstruct BitfieldDivide { 37244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith int bitfield : I / J; // expected-error{{expression is not an integral constant expression}} \ 38cb329c506d0e041b9523618158ac925d620c24acChris Lattner // expected-note{{division by zero}} 39df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor}; 40df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor 41df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregorvoid test_BitfieldDivide() { 42df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor (void)sizeof(BitfieldDivide<5, 1>); 437c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)sizeof(BitfieldDivide<5, 0>); // expected-note{{in instantiation of template class 'BitfieldDivide<5, 0>' requested here}} 44df0325110bb07ab62b808c8db8be2f6eee9b3476Douglas Gregor} 45ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor 46ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregortemplate<typename T, T I, int J> 47ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregorstruct BitfieldDep { 48ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor int bitfield : I + J; 49ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor}; 50ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor 51ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregorvoid test_BitfieldDep() { 52ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor (void)sizeof(BitfieldDep<int, 1, 5>); 53ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor} 54ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor 55bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregortemplate<int I> 56bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregorstruct BitfieldNeg { 57bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor int bitfield : (-I); // expected-error{{bit-field 'bitfield' has negative width (-5)}} 58bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor}; 59bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 60bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregortemplate<typename T, T I> 61bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregorstruct BitfieldNeg2 { 62bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor int bitfield : (-I); // expected-error{{bit-field 'bitfield' has negative width (-5)}} 63bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor}; 64bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 65bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregorvoid test_BitfieldNeg() { 66bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor (void)sizeof(BitfieldNeg<-5>); // okay 677c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)sizeof(BitfieldNeg<5>); // expected-note{{in instantiation of template class 'BitfieldNeg<5>' requested here}} 68bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor (void)sizeof(BitfieldNeg2<int, -5>); // okay 697c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)sizeof(BitfieldNeg2<int, 5>); // expected-note{{in instantiation of template class 'BitfieldNeg2<int, 5>' requested here}} 70bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor} 716ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor 726ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregortemplate<typename T> 736ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregorvoid increment(T &x) { 746ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor (void)++x; 756ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor} 766ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor 776ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregorstruct Incrementable { 786ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor Incrementable &operator++(); 796ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor}; 806ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor 816ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregorvoid test_increment(Incrementable inc) { 826ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor increment(inc); 836ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor} 846ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor 856ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregortemplate<typename T> 866ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregorvoid add(const T &x) { 876ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor (void)(x + x); 886ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor} 896ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor 90dc81c880cad01f01888632d28345077336ca06a4Douglas Gregornamespace PR6237 { 91dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor template <typename T> 92dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor void f(T t) { 93dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor t++; 94dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor } 95dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor 96dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor struct B { }; 97dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor B operator++(B &, int); 98dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor 99dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor template void f(B); 100dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor} 101dc81c880cad01f01888632d28345077336ca06a4Douglas Gregor 1026ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregorstruct Addable { 1036ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor Addable operator+(const Addable&) const; 1046ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor}; 1056ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor 1066ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregorvoid test_add(Addable &a) { 1076ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor add(a); 1086ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor} 109668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 110668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregorstruct CallOperator { 111668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor int &operator()(int); 112668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor double &operator()(double); 113668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor}; 114668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 115668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregortemplate<typename Result, typename F, typename Arg1> 116668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas GregorResult test_call_operator(F f, Arg1 arg1) { 117668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // PR5266: non-dependent invocations of a function call operator. 118668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor CallOperator call_op; 119668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor int &ir = call_op(17); 120668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return f(arg1); 121668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor} 122668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 123668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregorvoid test_call_operator(CallOperator call_op, int i, double d) { 124668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor int &ir = test_call_operator<int&>(call_op, i); 125668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor double &dr = test_call_operator<double&>(call_op, d); 126668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor} 127b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson 128b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlssontemplate<typename T> 129b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlssonvoid test_asm(T t) { 130d95e95ec5300249f5b7c6f1b72bde59e5141069cSimon Atanasyan asm ("nop" : "=r"(*t) : "r"(*t)); // expected-error {{indirection requires pointer operand ('int' invalid)}} 131b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson} 132b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson 133b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlssonvoid test_asm() { 134b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson int* a; 135b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson test_asm(a); 136b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson 137b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson int b; 138b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson test_asm(b); // expected-note {{in instantiation of function template specialization 'test_asm<int>' requested here}} 139b2e90aca3ed07f48a536acb3c4c5ade567703cbfAnders Carlsson} 140c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor 141c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregornamespace PR6424 { 142c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor template<int I> struct X { 143c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor X() { 144c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor int *ip = I; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} 145c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor } 146c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor }; 147c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor 148c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor template<int> struct Y { 149c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor typedef X<7> X7; 150c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor 151c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor void f() { X7(); } // expected-note{{instantiation}} 152c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor }; 153c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor 154c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor template void Y<3>::f(); 1551af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 1561af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor template<int I> 1571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor struct X2 { 1581af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor void *operator new(__SIZE_TYPE__) { 1591af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor int *ip = I; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} 1601af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return ip; 1611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 1621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor }; 1631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 1641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor template<int> struct Y2 { 1651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor typedef X2<7> X; 1661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor void f() { 1671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor new X(); // expected-note{{instantiation of}} 1681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 1691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor }; 1704e8ea0b2e163aa9681e2f14ad75ab4990a69d39bDouglas Gregor 1711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor template void Y2<3>::f(); 1724e8ea0b2e163aa9681e2f14ad75ab4990a69d39bDouglas Gregor 1734e8ea0b2e163aa9681e2f14ad75ab4990a69d39bDouglas Gregor template<typename T> 1744e8ea0b2e163aa9681e2f14ad75ab4990a69d39bDouglas Gregor void rdar10283928(int count) { 1754e8ea0b2e163aa9681e2f14ad75ab4990a69d39bDouglas Gregor (void)new char[count](); 1764e8ea0b2e163aa9681e2f14ad75ab4990a69d39bDouglas Gregor } 1774e8ea0b2e163aa9681e2f14ad75ab4990a69d39bDouglas Gregor 1784e8ea0b2e163aa9681e2f14ad75ab4990a69d39bDouglas Gregor template void rdar10283928<int>(int); 179c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor} 180f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman 181f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedmannamespace PR10864 { 182f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman template<typename T> class Vals {}; 183f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman template<> class Vals<int> { public: static const int i = 1; }; 184f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman template<> class Vals<float> { public: static const double i; }; 185f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman template<typename T> void test_asm_tied(T o) { 186f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman __asm("addl $1, %0" : "=r" (o) : "0"(Vals<T>::i)); // expected-error {{input with type 'double' matching output with type 'float'}} 187f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman } 188f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman void test_asm_tied() { 189f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman test_asm_tied(1); 190f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman test_asm_tied(1.f); // expected-note {{instantiation of}} 191f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman } 192f45b357c0d0df99e160a6320e279ef788dd91ba6Eli Friedman} 193