[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / clang / test / Analysis / builtin_bitcast.cpp
blob5a0d9e7189b8edd2cd6fb584b787a5dddbc945d4
1 // RUN: %clang_analyze_cc1 -triple x86_64-unknown-unknown -verify %s \
2 // RUN: -analyzer-checker=core,debug.ExprInspection
4 template <typename T> void clang_analyzer_dump(T);
5 using size_t = decltype(sizeof(int));
7 __attribute__((always_inline)) static inline constexpr unsigned int _castf32_u32(float __A) {
8 return __builtin_bit_cast(unsigned int, __A); // no-warning
11 void test(int i) {
12 _castf32_u32(42);
14 float f = 42;
16 // Loading from a floating point value results in unknown,
17 // which later materializes as a conjured value.
18 auto g = __builtin_bit_cast(unsigned int, f);
19 clang_analyzer_dump(g);
20 // expected-warning-re@-1 {{{{^conj_\$[0-9]+{unsigned int,}}}}
22 auto g2 = __builtin_bit_cast(unsigned int, 42.0f);
23 clang_analyzer_dump(g2);
24 // expected-warning-re@-1 {{{{^conj_\$[0-9]+{unsigned int,}}}}
26 auto g3 = __builtin_bit_cast(unsigned int, i);
27 clang_analyzer_dump(g3);
28 // expected-warning-re@-1 {{{{^reg_\$[0-9]+<int i>}}}}
30 auto g4 = __builtin_bit_cast(unsigned long, &i);
31 clang_analyzer_dump(g4);
32 // expected-warning@-1 {{&i [as 64 bit integer]}}
35 struct A {
36 int n;
37 void set(int x) {
38 n = x;
41 void gh_69922(size_t p) {
42 // expected-warning-re@+1 {{(reg_${{[0-9]+}}<size_t p>) & 1U}}
43 clang_analyzer_dump(__builtin_bit_cast(A*, p & 1));
45 __builtin_bit_cast(A*, p & 1)->set(2); // no-crash
46 // However, since the `this` pointer is expected to be a Loc, but we have
47 // NonLoc there, we simply give up and resolve it as `Unknown`.
48 // Then, inside the `set()` member function call we can't evaluate the
49 // store to the member variable `n`.
51 clang_analyzer_dump(__builtin_bit_cast(A*, p & 1)->n); // Ideally, this should print "2".
52 // expected-warning-re@-1 {{(reg_${{[0-9]+}}<size_t p>) & 1U}}