warn-tautological-undefined-compare.cpp revision 176edba5311f6eff0cad2631449885ddf4fbc9ea
1c6134762975204ceebcf7949e364484833714345Daichi Hirono// RUN: %clang_cc1 -fsyntax-only -verify %s
2c6134762975204ceebcf7949e364484833714345Daichi Hirono// RUN: %clang_cc1 -fsyntax-only -verify -Wtautological-undefined-compare %s
3c6134762975204ceebcf7949e364484833714345Daichi Hirono// RUN: %clang_cc1 -fsyntax-only -verify -Wno-tautological-compare -Wtautological-undefined-compare %s
4c6134762975204ceebcf7949e364484833714345Daichi Hirono// RUN: %clang_cc1 -fsyntax-only -verify -Wtautological-compare %s
5c6134762975204ceebcf7949e364484833714345Daichi Hirono
6c6134762975204ceebcf7949e364484833714345Daichi Hironovoid test1(int &x) {
7c6134762975204ceebcf7949e364484833714345Daichi Hirono  if (x == 1) { }
8c6134762975204ceebcf7949e364484833714345Daichi Hirono  if (&x == 0) { }
9c6134762975204ceebcf7949e364484833714345Daichi Hirono  // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
10c6134762975204ceebcf7949e364484833714345Daichi Hirono  if (&x != 0) { }
11c6134762975204ceebcf7949e364484833714345Daichi Hirono  // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
12c6134762975204ceebcf7949e364484833714345Daichi Hirono}
13c6134762975204ceebcf7949e364484833714345Daichi Hirono
14c6134762975204ceebcf7949e364484833714345Daichi Hironoclass test2 {
15c6134762975204ceebcf7949e364484833714345Daichi Hirono  test2() : x(y) {}
16c6134762975204ceebcf7949e364484833714345Daichi Hirono
17c6134762975204ceebcf7949e364484833714345Daichi Hirono  void foo() {
18c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (this == 0) { }
19c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{'this' pointer cannot be null in well-defined C++ code; comparison may be assumed to always evaluate to false}}
20c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (this != 0) { }
21c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{'this' pointer cannot be null in well-defined C++ code; comparison may be assumed to always evaluate to true}}
22c6134762975204ceebcf7949e364484833714345Daichi Hirono  }
23c6134762975204ceebcf7949e364484833714345Daichi Hirono
24a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono  void bar() {
25a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    if (x == 1) { }
26c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&x == 0) { }
27c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
28c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&x != 0) { }
29a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
30a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono  }
31c6134762975204ceebcf7949e364484833714345Daichi Hirono
32a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono  int &x;
33c6134762975204ceebcf7949e364484833714345Daichi Hirono  int y;
34c6134762975204ceebcf7949e364484833714345Daichi Hirono};
35c6134762975204ceebcf7949e364484833714345Daichi Hirono
36c6134762975204ceebcf7949e364484833714345Daichi Hirononamespace function_return_reference {
37c6134762975204ceebcf7949e364484833714345Daichi Hirono  int& get_int();
38c6134762975204ceebcf7949e364484833714345Daichi Hirono  // expected-note@-1 4{{'get_int' returns a reference}}
39c6134762975204ceebcf7949e364484833714345Daichi Hirono  class B {
40c6134762975204ceebcf7949e364484833714345Daichi Hirono  public:
41c6134762975204ceebcf7949e364484833714345Daichi Hirono    static int &stat();
42c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-note@-1 4{{'stat' returns a reference}}
43a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    int &get();
44a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-note@-1 8{{'get' returns a reference}}
45c6134762975204ceebcf7949e364484833714345Daichi Hirono  };
46c6134762975204ceebcf7949e364484833714345Daichi Hirono
47c6134762975204ceebcf7949e364484833714345Daichi Hirono  void test() {
48c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&get_int() == 0) {}
49c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
50c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(get_int()) == 0) {}
51a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
52a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono
53a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    if (&get_int() != 0) {}
54a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
55a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    if (&(get_int()) != 0) {}
56a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
57a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono
58a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    if (&B::stat() == 0) {}
59a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
60a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    if (&(B::stat()) == 0) {}
61a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
62c6134762975204ceebcf7949e364484833714345Daichi Hirono
63a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    if (&B::stat() != 0) {}
64a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
65c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(B::stat()) != 0) {}
66c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
67c6134762975204ceebcf7949e364484833714345Daichi Hirono
68c6134762975204ceebcf7949e364484833714345Daichi Hirono    B b;
69c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&b.get() == 0) {}
70c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
71c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(b.get()) == 0) {}
72c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
73c6134762975204ceebcf7949e364484833714345Daichi Hirono
74c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&b.get() != 0) {}
75c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
76c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(b.get()) != 0) {}
77c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
78c6134762975204ceebcf7949e364484833714345Daichi Hirono
79c6134762975204ceebcf7949e364484833714345Daichi Hirono    B* b_ptr = &b;
80c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&b_ptr->get() == 0) {}
81c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
82c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(b_ptr->get()) == 0) {}
83c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
84c6134762975204ceebcf7949e364484833714345Daichi Hirono
85c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&b_ptr->get() != 0) {}
86c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
87c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(b_ptr->get()) != 0) {}
88c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
89c6134762975204ceebcf7949e364484833714345Daichi Hirono
90c6134762975204ceebcf7949e364484833714345Daichi Hirono    int& (B::*m_ptr)() = &B::get;
91c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(b.*m_ptr)() == 0) {}
92c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
93c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&((b.*m_ptr)()) == 0) {}
94c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
95c6134762975204ceebcf7949e364484833714345Daichi Hirono
96c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(b.*m_ptr)() != 0) {}
97c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
98c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&((b.*m_ptr)()) != 0) {}
99c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
100c6134762975204ceebcf7949e364484833714345Daichi Hirono
101c6134762975204ceebcf7949e364484833714345Daichi Hirono    int& (*f_ptr)() = &get_int;
102c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(*f_ptr)() == 0) {}
103c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
104c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&((*f_ptr)()) == 0) {}
105c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
106c6134762975204ceebcf7949e364484833714345Daichi Hirono
107c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&(*f_ptr)() != 0) {}
108c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
109c6134762975204ceebcf7949e364484833714345Daichi Hirono    if (&((*f_ptr)()) != 0) {}
110c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
111c6134762975204ceebcf7949e364484833714345Daichi Hirono  }
112c6134762975204ceebcf7949e364484833714345Daichi Hirono}
113c6134762975204ceebcf7949e364484833714345Daichi Hirono
114c6134762975204ceebcf7949e364484833714345Daichi Hirononamespace macros {
115c6134762975204ceebcf7949e364484833714345Daichi Hirono  #define assert(x) if (x) {}
116c6134762975204ceebcf7949e364484833714345Daichi Hirono
117c6134762975204ceebcf7949e364484833714345Daichi Hirono  void test(int &x) {
118a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    assert(&x != 0);
119a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
120a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    assert(&x == 0);
121a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
122c6134762975204ceebcf7949e364484833714345Daichi Hirono    assert(&x != 0 && "Expecting valid reference");
123c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
124c6134762975204ceebcf7949e364484833714345Daichi Hirono    assert(&x == 0 && "Expecting invalid reference");
125c6134762975204ceebcf7949e364484833714345Daichi Hirono    // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false}}
126c6134762975204ceebcf7949e364484833714345Daichi Hirono  }
127a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono
128c6134762975204ceebcf7949e364484833714345Daichi Hirono  class S {
129c6134762975204ceebcf7949e364484833714345Daichi Hirono    void test() {
130c6134762975204ceebcf7949e364484833714345Daichi Hirono      assert(this != 0);
131c6134762975204ceebcf7949e364484833714345Daichi Hirono      // expected-warning@-1{{'this' pointer cannot be null in well-defined C++ code; comparison may be assumed to always evaluate to true}}
132a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono      assert(this == 0);
133a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono      // expected-warning@-1{{'this' pointer cannot be null in well-defined C++ code; comparison may be assumed to always evaluate to false}}
134c6134762975204ceebcf7949e364484833714345Daichi Hirono      assert(this != 0 && "Expecting valid reference");
135c6134762975204ceebcf7949e364484833714345Daichi Hirono      // expected-warning@-1{{'this' pointer cannot be null in well-defined C++ code; comparison may be assumed to always evaluate to true}}
136c6134762975204ceebcf7949e364484833714345Daichi Hirono      assert(this == 0 && "Expecting invalid reference");
137c6134762975204ceebcf7949e364484833714345Daichi Hirono      // expected-warning@-1{{'this' pointer cannot be null in well-defined C++ code; comparison may be assumed to always evaluate to false}}
138c6134762975204ceebcf7949e364484833714345Daichi Hirono    }
139c6134762975204ceebcf7949e364484833714345Daichi Hirono  };
140c6134762975204ceebcf7949e364484833714345Daichi Hirono}
141c6134762975204ceebcf7949e364484833714345Daichi Hirono