forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			138 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-constant-conversion %s
 | 
						|
 | 
						|
void choice(int);
 | 
						|
int choice(bool);
 | 
						|
 | 
						|
void test() {
 | 
						|
  // Result of ! must be type bool.
 | 
						|
  int i = choice(!1);
 | 
						|
}
 | 
						|
 | 
						|
// rdar://8018252
 | 
						|
void f0() {
 | 
						|
  extern void f0_1(int*);
 | 
						|
  register int x;
 | 
						|
  f0_1(&x);
 | 
						|
}
 | 
						|
 | 
						|
namespace test1 {
 | 
						|
  template <class T> void bar(T &x) { T::fail(); }
 | 
						|
  template <class T> void bar(volatile T &x) {}
 | 
						|
 | 
						|
  void test_ints() {
 | 
						|
    volatile int x;
 | 
						|
    bar(x = 5);
 | 
						|
    bar(x += 5);
 | 
						|
  }
 | 
						|
 | 
						|
  enum E { E_zero };
 | 
						|
  void test_enums() {
 | 
						|
    volatile E x;
 | 
						|
    bar(x = E_zero);
 | 
						|
    bar(x += E_zero); // expected-error {{incompatible type}}
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int test2(int x) {
 | 
						|
  return x && 4; // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
 | 
						|
  return x && sizeof(int) == 4;  // no warning, RHS is logical op.
 | 
						|
  return x && true;
 | 
						|
  return x && false;
 | 
						|
  return x || true;
 | 
						|
  return x || false;
 | 
						|
 | 
						|
  return x && (unsigned)0; // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
 | 
						|
  return x || (unsigned)1; // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
 | 
						|
  return x || 0; // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
  return x || 1; // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
  return x || -1; // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
  return x || 5; // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
  return x && 0; // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
  return x && 1; // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
  return x && -1; // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
  return x && 5; // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
  return x || (0); // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
  return x || (1); // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
  return x || (-1); // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
  return x || (5); // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                   // expected-note {{use '|' for a bitwise operation}}
 | 
						|
  return x && (0); // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
  return x && (1); // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
  return x && (-1); // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
  return x && (5); // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                   // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                   // expected-note {{remove constant to silence this warning}}
 | 
						|
}
 | 
						|
 | 
						|
template<unsigned int A, unsigned int B> struct S
 | 
						|
{
 | 
						|
  enum {
 | 
						|
    e1 = A && B,
 | 
						|
    e2 = A && 7      // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                     // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                     // expected-note {{remove constant to silence this warning}}
 | 
						|
  };
 | 
						|
 | 
						|
  int foo() {
 | 
						|
    int x = A && B;
 | 
						|
    int y = B && 3;  // expected-warning {{use of logical '&&' with constant operand}} \
 | 
						|
                     // expected-note {{use '&' for a bitwise operation}} \
 | 
						|
                     // expected-note {{remove constant to silence this warning}}
 | 
						|
 | 
						|
    return x + y;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
void test3() {
 | 
						|
  S<5, 8> s1;
 | 
						|
  S<2, 7> s2;
 | 
						|
  (void)s1.foo();
 | 
						|
  (void)s2.foo();
 | 
						|
}
 | 
						|
 | 
						|
namespace pr16992 {
 | 
						|
  typedef int T;
 | 
						|
  unsigned getsz() {
 | 
						|
    return (sizeof T());
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void test4() {
 | 
						|
  #define X 0
 | 
						|
  #define Y 1
 | 
						|
  bool r1 = X || Y;
 | 
						|
 | 
						|
  #define Y2 2
 | 
						|
  bool r2 = X || Y2; // expected-warning {{use of logical '||' with constant operand}} \
 | 
						|
                     // expected-note {{use '|' for a bitwise operation}}
 | 
						|
}
 |