| // RUN: %clang_cc1 -fsyntax-only -analyze \ |
| // RUN: -analyzer-checker=core,debug.ExprInspection %s -verify |
| |
| // These test cases demonstrate lack of Static Analyzer features. |
| // The FIXME: tags indicate where we expect different output. |
| |
| // Handle constructors for default arguments. |
| // Default arguments in C++ are recomputed at every call, |
| // and are therefore local, and not static, variables. |
| void clang_analyzer_eval(bool); |
| void clang_analyzer_warnIfReached(); |
| |
| struct init_with_list { |
| int a; |
| init_with_list() : a(1) {} |
| }; |
| |
| struct init_in_body { |
| int a; |
| init_in_body() { a = 1; } |
| }; |
| |
| struct init_default_member { |
| int a = 1; |
| }; |
| |
| struct basic_struct { |
| int a; |
| }; |
| |
| // Top-level analyzed functions. |
| void top_f(init_with_list l = init_with_list()) { |
| // We expect that the analyzer doesn't assume anything about the parameter. |
| clang_analyzer_eval(l.a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |
| |
| void top_g(init_in_body l = init_in_body()) { |
| // We expect that the analyzer doesn't assume anything about the parameter. |
| clang_analyzer_eval(l.a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |
| |
| void top_h(init_default_member l = init_default_member()) { |
| // We expect that the analyzer doesn't assume anything about the parameter. |
| clang_analyzer_eval(l.a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |
| |
| // Not-top-level analyzed functions. |
| int called_f(init_with_list l = init_with_list()) { |
| // We expect that the analyzer assumes the default value |
| // when called from test2(). |
| return l.a; |
| } |
| |
| int called_g(init_in_body l = init_in_body()) { |
| // We expect that the analyzer assumes the default value |
| // when called from test3(). |
| return l.a; |
| } |
| |
| int called_h(init_default_member l = init_default_member()) { |
| // We expect that the analyzer assumes the default value |
| // when called from test4(). |
| return l.a; |
| } |
| |
| int called_i(const init_with_list &l = init_with_list()){ |
| // We expect that the analyzer assumes the default value |
| // when called from test5(). |
| return l.a; |
| } |
| |
| int called_j(init_with_list &&l = init_with_list()){ |
| // We expect that the analyzer assumes the default value |
| // when called from test6(). |
| return l.a; |
| } |
| |
| int plain_parameter_passing(basic_struct l) { |
| return l.a; |
| } |
| |
| void test1() { |
| basic_struct b; |
| b.a = 1; |
| clang_analyzer_eval(plain_parameter_passing(b) == 1); //expected-warning {{TRUE}} |
| } |
| |
| void test2() { |
| // We expect that the analyzer assumes the default value. |
| // FIXME: Should be TRUE. |
| clang_analyzer_eval(called_f() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |
| |
| void test3() { |
| // We expect that the analyzer assumes the default value. |
| // FIXME: Should be TRUE. |
| clang_analyzer_eval(called_g() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |
| |
| void test4() { |
| // We expect that the analyzer assumes the default value. |
| // FIXME: Should be TRUE. |
| clang_analyzer_eval(called_h() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |
| |
| void test5() { |
| //We expect that the analyzer assumes the default value. |
| // FIXME: Should be TRUE. |
| clang_analyzer_eval(called_i() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |
| |
| void test6() { |
| // We expect that the analyzer assumes the default value. |
| // FIXME: Should be TRUE. |
| clang_analyzer_eval(called_j() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |