• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()10 void t2() {
11   test p = {{1,2}};
12   test q;
13   q = p;
14 }
15 
PR7287(X0 a,X0 b)16 bool 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)30 void 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