| // RUN: %clang_analyze_cc1 -verify=common %s \ |
| // RUN: -analyzer-checker=deadcode.DeadStores,debug.ExprInspection \ |
| // RUN: -analyzer-note-analysis-entry-points |
| |
| // RUN: %clang_analyze_cc1 -verify=common,textout %s \ |
| // RUN: -analyzer-checker=deadcode.DeadStores,debug.ExprInspection \ |
| // RUN: -analyzer-note-analysis-entry-points \ |
| // RUN: -analyzer-output=text |
| |
| // Test the actual source locations/ranges of entry point notes. |
| // RUN: %clang_analyze_cc1 %s \ |
| // RUN: -analyzer-checker=deadcode.DeadStores,debug.ExprInspection \ |
| // RUN: -analyzer-note-analysis-entry-points \ |
| // RUN: -analyzer-output=text 2>&1 \ |
| // RUN: | FileCheck --strict-whitespace %s |
| |
| |
| void clang_analyzer_warnIfReached(); |
| |
| void other() { |
| // common-warning@+1 {{REACHABLE}} textout-note@+1 {{REACHABLE}} |
| clang_analyzer_warnIfReached(); |
| } |
| |
| struct SomeOtherStruct { |
| // CHECK: note: [debug] analyzing from SomeOtherStruct::f() |
| // CHECK-NEXT: | void f() { |
| // CHECK-NEXT: | ^ |
| // textout-note@+1 {{[debug] analyzing from SomeOtherStruct::f()}} |
| void f() { |
| other(); // textout-note {{Calling 'other'}} |
| } |
| }; |
| |
| // CHECK: note: [debug] analyzing from operator""_w(const char *) |
| // CHECK-NEXT: | unsigned operator ""_w(const char*) { |
| // CHECK-NEXT: | ^ |
| // textout-note@+1 {{[debug] analyzing from operator""_w(const char *)}} |
| unsigned operator ""_w(const char*) { |
| // common-warning@+1 {{REACHABLE}} textout-note@+1 {{REACHABLE}} |
| clang_analyzer_warnIfReached(); |
| return 404; |
| } |
| |
| // textout-note@+1 {{[debug] analyzing from checkASTCodeBodyHasAnalysisEntryPoints()}} |
| void checkASTCodeBodyHasAnalysisEntryPoints() { |
| int z = 1; |
| z = 2; |
| // common-warning@-1 {{Value stored to 'z' is never read}} |
| // textout-note@-2 {{Value stored to 'z' is never read}} |
| } |
| |
| void notInvokedLambdaScope() { |
| // CHECK: note: [debug] analyzing from notInvokedLambdaScope()::(anonymous class)::operator()() |
| // CHECK-NEXT: | auto notInvokedLambda = []() { |
| // CHECK-NEXT: | ^ |
| // textout-note@+1 {{[debug] analyzing from notInvokedLambdaScope()::(anonymous class)::operator()()}} |
| auto notInvokedLambda = []() { |
| // common-warning@+1 {{REACHABLE}} textout-note@+1 {{REACHABLE}} |
| clang_analyzer_warnIfReached(); |
| }; |
| (void)notInvokedLambda; // Not invoking the lambda. |
| } |
| |
| // CHECK: note: [debug] analyzing from invokedLambdaScope() |
| // CHECK-NEXT: | void invokedLambdaScope() { |
| // CHECK-NEXT: | ^ |
| // textout-note@+1 {{[debug] analyzing from invokedLambdaScope()}} |
| void invokedLambdaScope() { |
| auto invokedLambda = []() { |
| // common-warning@+1 {{REACHABLE}} textout-note@+1 {{REACHABLE}} |
| clang_analyzer_warnIfReached(); |
| }; |
| invokedLambda(); // textout-note {{Calling 'operator()'}} |
| } |