| // RUN: %clang_analyze_cc1 -x c++ -analyzer-checker=debug.ExprInspection \ | |
| // RUN: -analyzer-config support-symbolic-integer-casts=false \ | |
| // RUN: -verify %s | |
| // RUN: %clang_analyze_cc1 -x c++ -analyzer-checker=debug.ExprInspection \ | |
| // RUN: -analyzer-config support-symbolic-integer-casts=true \ | |
| // RUN: -verify %s | |
| template <typename T> | |
| void clang_analyzer_dump(T); | |
| void test_no_redundant_floating_point_cast(int n) { | |
| double D = n / 30; | |
| clang_analyzer_dump(D); // expected-warning{{(double) ((reg_$0<int n>) / 30)}} | |
| // There are two cast operations evaluated above: | |
| // 1. (n / 30) is cast to a double during the store of `D`. | |
| // 2. Then in the next line, in RegionStore::getBinding during the load of `D`. | |
| // | |
| // We should not see in the dump of the SVal any redundant casts like | |
| // (double) ((double) $n / 30) | |
| } |