1*9d2e8307Sisuckatcs // RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
2*9d2e8307Sisuckatcs 
3*9d2e8307Sisuckatcs void clang_analyzer_eval(bool);
45c2d5f06SNico Weber 
55c2d5f06SNico Weber struct s { int a; };
foo()65c2d5f06SNico Weber int foo() {
7*9d2e8307Sisuckatcs   auto [a] = s{1};
8*9d2e8307Sisuckatcs   clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}
91da13237SDávid Bolvanský } // expected-warning{{non-void function does not return a value}}
105c2d5f06SNico Weber 
11*9d2e8307Sisuckatcs struct s2 {
12*9d2e8307Sisuckatcs   int &x;
13*9d2e8307Sisuckatcs };
14*9d2e8307Sisuckatcs 
foo2(s2 in)15*9d2e8307Sisuckatcs int *foo2(s2 in) {
16*9d2e8307Sisuckatcs   auto [a] = in;
17*9d2e8307Sisuckatcs   return &a;
18*9d2e8307Sisuckatcs }
19*9d2e8307Sisuckatcs 
bar()20*9d2e8307Sisuckatcs void bar() {
21*9d2e8307Sisuckatcs   int i = 1;
22*9d2e8307Sisuckatcs   s2 a{i};
23*9d2e8307Sisuckatcs 
24*9d2e8307Sisuckatcs   auto *x = foo2(a);
25*9d2e8307Sisuckatcs 
26*9d2e8307Sisuckatcs   clang_analyzer_eval(*x == i); // expected-warning{{TRUE}}
27*9d2e8307Sisuckatcs 
28*9d2e8307Sisuckatcs   *x = 2;
29*9d2e8307Sisuckatcs 
30*9d2e8307Sisuckatcs   clang_analyzer_eval(*x == 2); // expected-warning{{TRUE}}
31*9d2e8307Sisuckatcs   clang_analyzer_eval(i == 2);  // expected-warning{{TRUE}}
32*9d2e8307Sisuckatcs }
33