// RUN: %clang_cc1 -fsyntax-only -verify %s template struct Bitfields { int simple : I; // expected-error{{bit-field 'simple' has zero width}} int parens : (J); }; void test_Bitfields(Bitfields<0, 5> *b) { (void)sizeof(Bitfields<10, 5>); (void)sizeof(Bitfields<0, 1>); // expected-note{{in instantiation of template class 'Bitfields<0, 1>' requested here}} } template struct BitfieldPlus { int bitfield : I + J; // expected-error{{bit-field 'bitfield' has zero width}} }; void test_BitfieldPlus() { (void)sizeof(BitfieldPlus<0, 1>); (void)sizeof(BitfieldPlus<-5, 5>); // expected-note{{in instantiation of template class 'BitfieldPlus<-5, 5>' requested here}} } template struct BitfieldMinus { int bitfield : I - J; // expected-error{{bit-field 'bitfield' has negative width (-1)}} \ // expected-error{{bit-field 'bitfield' has zero width}} }; void test_BitfieldMinus() { (void)sizeof(BitfieldMinus<5, 1>); (void)sizeof(BitfieldMinus<0, 1>); // expected-note{{in instantiation of template class 'BitfieldMinus<0, 1>' requested here}} (void)sizeof(BitfieldMinus<5, 5>); // expected-note{{in instantiation of template class 'BitfieldMinus<5, 5>' requested here}} } template struct BitfieldDivide { int bitfield : I / J; // expected-error{{expression is not an integral constant expression}} \ // expected-note{{division by zero}} }; void test_BitfieldDivide() { (void)sizeof(BitfieldDivide<5, 1>); (void)sizeof(BitfieldDivide<5, 0>); // expected-note{{in instantiation of template class 'BitfieldDivide<5, 0>' requested here}} } template struct BitfieldDep { int bitfield : I + J; }; void test_BitfieldDep() { (void)sizeof(BitfieldDep); } template struct BitfieldNeg { int bitfield : (-I); // expected-error{{bit-field 'bitfield' has negative width (-5)}} }; template struct BitfieldNeg2 { int bitfield : (-I); // expected-error{{bit-field 'bitfield' has negative width (-5)}} }; void test_BitfieldNeg() { (void)sizeof(BitfieldNeg<-5>); // okay (void)sizeof(BitfieldNeg<5>); // expected-note{{in instantiation of template class 'BitfieldNeg<5>' requested here}} (void)sizeof(BitfieldNeg2); // okay (void)sizeof(BitfieldNeg2); // expected-note{{in instantiation of template class 'BitfieldNeg2' requested here}} } template void increment(T &x) { (void)++x; } struct Incrementable { Incrementable &operator++(); }; void test_increment(Incrementable inc) { increment(inc); } template void add(const T &x) { (void)(x + x); } namespace PR6237 { template void f(T t) { t++; } struct B { }; B operator++(B &, int); template void f(B); } struct Addable { Addable operator+(const Addable&) const; }; void test_add(Addable &a) { add(a); } struct CallOperator { int &operator()(int); double &operator()(double); }; template Result test_call_operator(F f, Arg1 arg1) { // PR5266: non-dependent invocations of a function call operator. CallOperator call_op; int &ir = call_op(17); return f(arg1); } void test_call_operator(CallOperator call_op, int i, double d) { int &ir = test_call_operator(call_op, i); double &dr = test_call_operator(call_op, d); } template void test_asm(T t) { asm ("nop" : "=a"(*t) : "r"(*t)); // expected-error {{indirection requires pointer operand ('int' invalid)}} } void test_asm() { int* a; test_asm(a); int b; test_asm(b); // expected-note {{in instantiation of function template specialization 'test_asm' requested here}} } namespace PR6424 { template struct X { X() { int *ip = I; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} } }; template struct Y { typedef X<7> X7; void f() { X7(); } // expected-note{{instantiation}} }; template void Y<3>::f(); template struct X2 { void *operator new(__SIZE_TYPE__) { int *ip = I; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} return ip; } }; template struct Y2 { typedef X2<7> X; void f() { new X(); // expected-note{{instantiation of}} } }; template void Y2<3>::f(); template void rdar10283928(int count) { (void)new char[count](); } template void rdar10283928(int); } namespace PR10864 { template class Vals {}; template<> class Vals { public: static const int i = 1; }; template<> class Vals { public: static const double i; }; template void test_asm_tied(T o) { __asm("addl $1, %0" : "=r" (o) : "0"(Vals::i)); // expected-error {{input with type 'double' matching output with type 'float'}} } void test_asm_tied() { test_asm_tied(1); test_asm_tied(1.f); // expected-note {{instantiation of}} } }