1*aa454ddaSBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-unknown-unknown -verify %s \
2*aa454ddaSBalazs Benics // RUN:   -analyzer-checker=core,debug.ExprInspection
3*aa454ddaSBalazs Benics 
4*aa454ddaSBalazs Benics template <typename T> void clang_analyzer_dump(T);
5*aa454ddaSBalazs Benics 
_castf32_u32(float __A)6*aa454ddaSBalazs Benics __attribute__((always_inline)) static inline constexpr unsigned int _castf32_u32(float __A) {
7*aa454ddaSBalazs Benics   return __builtin_bit_cast(unsigned int, __A); // no-warning
8*aa454ddaSBalazs Benics }
9*aa454ddaSBalazs Benics 
test(int i)10*aa454ddaSBalazs Benics void test(int i) {
11*aa454ddaSBalazs Benics   _castf32_u32(42);
12*aa454ddaSBalazs Benics 
13*aa454ddaSBalazs Benics   float f = 42;
14*aa454ddaSBalazs Benics 
15*aa454ddaSBalazs Benics   // Loading from a floating point value results in unknown,
16*aa454ddaSBalazs Benics   // which later materializes as a conjured value.
17*aa454ddaSBalazs Benics   auto g = __builtin_bit_cast(unsigned int, f);
18*aa454ddaSBalazs Benics   clang_analyzer_dump(g);
19*aa454ddaSBalazs Benics   // expected-warning-re@-1 {{{{^conj_\$[0-9]+{unsigned int,}}}}
20*aa454ddaSBalazs Benics 
21*aa454ddaSBalazs Benics   auto g2 = __builtin_bit_cast(unsigned int, 42.0f);
22*aa454ddaSBalazs Benics   clang_analyzer_dump(g2);
23*aa454ddaSBalazs Benics   // expected-warning-re@-1 {{{{^conj_\$[0-9]+{unsigned int,}}}}
24*aa454ddaSBalazs Benics 
25*aa454ddaSBalazs Benics   auto g3 = __builtin_bit_cast(unsigned int, i);
26*aa454ddaSBalazs Benics   clang_analyzer_dump(g3);
27*aa454ddaSBalazs Benics   // expected-warning-re@-1 {{{{^reg_\$[0-9]+<int i>}}}}
28*aa454ddaSBalazs Benics 
29*aa454ddaSBalazs Benics   auto g4 = __builtin_bit_cast(unsigned long, &i);
30*aa454ddaSBalazs Benics   clang_analyzer_dump(g4);
31*aa454ddaSBalazs Benics   // expected-warning@-1 {{&i [as 64 bit integer]}}
32*aa454ddaSBalazs Benics }
33