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