1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -verify %s 2 void clang_analyzer_eval(bool); 3 4 struct X0 { }; 5 bool operator==(const X0&, const X0&); 6 7 // PR7287 8 struct test { int a[2]; }; 9 t2()10void t2() { 11 test p = {{1,2}}; 12 test q; 13 q = p; 14 } 15 PR7287(X0 a,X0 b)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 24 struct IntComparable { operator ==IntComparable25 bool operator==(int x) const { 26 return x == 0; 27 } 28 }; 29 testMemberOperator(IntComparable B)30void testMemberOperator(IntComparable B) { 31 clang_analyzer_eval(B == 0); // expected-warning{{TRUE}} 32 } 33 34 35 36 namespace UserDefinedConversions { 37 class Convertible { 38 public: operator int() const39 operator int() const { 40 return 42; 41 } operator bool() const42 operator bool() const { 43 return true; 44 } 45 }; 46 test(const Convertible & obj)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