operator-calls.cpp revision c386d8f148c1a9d4992c64188e2873fcbc6da20d
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-ipa=inlining -verify %s
2void clang_analyzer_eval(bool);
3
4struct X0 { };
5bool operator==(const X0&, const X0&);
6
7// PR7287
8struct test { int a[2]; };
9
10void t2() {
11  test p = {{1,2}};
12  test q;
13  q = p;
14}
15
16bool PR7287(X0 a, X0 b) {
17  return operator==(a, b);
18}
19
20
21// Inlining non-static member operators mistakenly treated 'this' as the first
22// argument for a while.
23
24struct IntComparable {
25  bool operator==(int x) const {
26    return x == 0;
27  }
28};
29
30void testMemberOperator(IntComparable B) {
31  clang_analyzer_eval(B == 0); // expected-warning{{TRUE}}
32}
33
34
35
36namespace UserDefinedConversions {
37  class Convertible {
38  public:
39    operator int() const {
40      return 42;
41    }
42    operator bool() const {
43      return true;
44    }
45  };
46
47  void test(const Convertible &obj) {
48    clang_analyzer_eval((int)obj == 42); // expected-warning{{TRUE}}
49    clang_analyzer_eval(obj); // expected-warning{{TRUE}}
50  }
51}
52