1// RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -Wconversion -verify %s
2
3#include <stddef.h>
4
5typedef   signed char  int8_t;
6typedef   signed short int16_t;
7typedef   signed int   int32_t;
8typedef   signed long  int64_t;
9
10typedef unsigned char  uint8_t;
11typedef unsigned short uint16_t;
12typedef unsigned int   uint32_t;
13typedef unsigned long  uint64_t;
14
15// <rdar://problem/7909130>
16namespace test0 {
17  int32_t test1_positive(char *I, char *E) {
18    return (E - I); // expected-warning {{implicit conversion loses integer precision}}
19  }
20
21  int32_t test1_negative(char *I, char *E) {
22    return static_cast<int32_t>(E - I);
23  }
24
25  uint32_t test2_positive(uint64_t x) {
26    return x; // expected-warning {{implicit conversion loses integer precision}}
27  }
28
29  uint32_t test2_negative(uint64_t x) {
30    return (uint32_t) x;
31  }
32}
33
34namespace test1 {
35  uint64_t test1(int x, unsigned y) {
36    return sizeof(x == y);
37  }
38
39  uint64_t test2(int x, unsigned y) {
40    return __alignof(x == y);
41  }
42
43  void * const foo();
44  bool test2(void *p) {
45    return p == foo();
46  }
47}
48
49namespace test2 {
50  struct A {
51    unsigned int x : 2;
52    A() : x(10) {} // expected-warning {{implicit truncation from 'int' to bitfield changes value from 10 to 2}}
53  };
54}
55
56void test3() {
57  int a = NULL; // expected-warning {{implicit conversion of NULL constant to integer}}
58  int b;
59  b = NULL; // expected-warning {{implicit conversion of NULL constant to integer}}
60  int c = ((((NULL)))); // expected-warning {{implicit conversion of NULL constant to integer}}
61  int d;
62  d = ((((NULL)))); // expected-warning {{implicit conversion of NULL constant to integer}}
63}
64