189d210feSCharusso // RUN: %clang_analyze_cc1 -std=c++20 \
289d210feSCharusso // RUN:  -analyzer-checker=core,unix,cplusplus,debug.ExprInspection \
389d210feSCharusso // RUN:  -triple x86_64-unknown-linux-gnu \
489d210feSCharusso // RUN:  -verify %s
589d210feSCharusso 
689d210feSCharusso #include "Inputs/system-header-simulator-cxx.h"
789d210feSCharusso 
889d210feSCharusso typedef __SIZE_TYPE__ size_t;
989d210feSCharusso void *malloc(size_t);
1089d210feSCharusso void *alloca(size_t);
1189d210feSCharusso void *realloc(void *ptr, size_t size);
1289d210feSCharusso void *calloc(size_t number, size_t size);
1389d210feSCharusso void free(void *);
1489d210feSCharusso 
1589d210feSCharusso struct S {
1689d210feSCharusso   int f;
1789d210feSCharusso };
1889d210feSCharusso 
1989d210feSCharusso void clang_analyzer_dump(int);
2089d210feSCharusso void clang_analyzer_dump(const void *);
2189d210feSCharusso void clang_analyzer_dumpExtent(int);
2289d210feSCharusso void clang_analyzer_dumpExtent(const void *);
2389d210feSCharusso void clang_analyzer_dumpElementCount(int);
2489d210feSCharusso void clang_analyzer_dumpElementCount(const void *);
2589d210feSCharusso 
2689d210feSCharusso int clang_analyzer_getExtent(void *);
2789d210feSCharusso void clang_analyzer_eval(bool);
2889d210feSCharusso 
var_simple_ref()2989d210feSCharusso void var_simple_ref() {
3089d210feSCharusso   int a = 13;
3189d210feSCharusso   clang_analyzer_dump(&a);             // expected-warning {{a}}
3289d210feSCharusso   clang_analyzer_dumpExtent(&a);       // expected-warning {{4 S64b}}
3389d210feSCharusso   clang_analyzer_dumpElementCount(&a); // expected-warning {{1 S64b}}
3489d210feSCharusso }
3589d210feSCharusso 
var_simple_ptr(int * a)3689d210feSCharusso void var_simple_ptr(int *a) {
3789d210feSCharusso   clang_analyzer_dump(a);             // expected-warning {{SymRegion{reg_$0<int * a>}}}
3889d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning {{extent_$1{SymRegion{reg_$0<int * a>}}}}
3989d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning {{(extent_$1{SymRegion{reg_$0<int * a>}}) / 4}}
4089d210feSCharusso }
4189d210feSCharusso 
var_array()4289d210feSCharusso void var_array() {
4389d210feSCharusso   int a[] = {1, 2, 3};
4489d210feSCharusso   clang_analyzer_dump(a);             // expected-warning {{Element{a,0 S64b,int}}}
4589d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning {{12 S64b}}
4689d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
4789d210feSCharusso }
4889d210feSCharusso 
string()4989d210feSCharusso void string() {
5089d210feSCharusso   clang_analyzer_dump("foo");             // expected-warning {{Element{"foo",0 S64b,char}}}
5189d210feSCharusso   clang_analyzer_dumpExtent("foo");       // expected-warning {{4 S64b}}
5289d210feSCharusso   clang_analyzer_dumpElementCount("foo"); // expected-warning {{4 S64b}}
5389d210feSCharusso }
5489d210feSCharusso 
struct_simple_ptr(S * a)5589d210feSCharusso void struct_simple_ptr(S *a) {
56*888673b6SJonas Devlieghere   clang_analyzer_dump(a);             // expected-warning {{SymRegion{reg_$0<struct S * a>}}}
57*888673b6SJonas Devlieghere   clang_analyzer_dumpExtent(a);       // expected-warning {{extent_$1{SymRegion{reg_$0<struct S * a>}}}}
58*888673b6SJonas Devlieghere   clang_analyzer_dumpElementCount(a); // expected-warning {{(extent_$1{SymRegion{reg_$0<struct S * a>}}) / 4}}
5989d210feSCharusso }
6089d210feSCharusso 
field_ref(S a)6189d210feSCharusso void field_ref(S a) {
6289d210feSCharusso   clang_analyzer_dump(&a.f);             // expected-warning {{a.f}}
6389d210feSCharusso   clang_analyzer_dumpExtent(&a.f);       // expected-warning {{4 S64b}}
6489d210feSCharusso   clang_analyzer_dumpElementCount(&a.f); // expected-warning {{1 S64b}}
6589d210feSCharusso }
6689d210feSCharusso 
field_ptr(S * a)6789d210feSCharusso void field_ptr(S *a) {
68*888673b6SJonas Devlieghere   clang_analyzer_dump(&a->f);             // expected-warning {{SymRegion{reg_$0<struct S * a>}.f}}
6989d210feSCharusso   clang_analyzer_dumpExtent(&a->f);       // expected-warning {{4 S64b}}
7089d210feSCharusso   clang_analyzer_dumpElementCount(&a->f); // expected-warning {{1 S64b}}
7189d210feSCharusso }
7289d210feSCharusso 
symbolic_array()7389d210feSCharusso void symbolic_array() {
7489d210feSCharusso   int *a = new int[3];
7589d210feSCharusso   clang_analyzer_dump(a);             // expected-warning {{Element{HeapSymRegion{conj}}
7689d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning {{12 S64b}}
7789d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
7889d210feSCharusso   delete[] a;
7989d210feSCharusso }
8089d210feSCharusso 
symbolic_placement_new()8189d210feSCharusso void symbolic_placement_new() {
8289d210feSCharusso   char *buf = new char[sizeof(int) * 3];
8389d210feSCharusso   int *a = new (buf) int(12);
8489d210feSCharusso   clang_analyzer_dump(a);             // expected-warning {{Element{HeapSymRegion{conj}}
8589d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning {{12 S64b}}
8689d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
8789d210feSCharusso   delete[] buf;
8889d210feSCharusso }
8989d210feSCharusso 
symbolic_malloc()9089d210feSCharusso void symbolic_malloc() {
9189d210feSCharusso   int *a = (int *)malloc(12);
9289d210feSCharusso   clang_analyzer_dump(a);             // expected-warning {{Element{HeapSymRegion{conj}}
9389d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning {{12 U64b}}
9489d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
9589d210feSCharusso   free(a);
9689d210feSCharusso }
9789d210feSCharusso 
symbolic_alloca()9889d210feSCharusso void symbolic_alloca() {
9989d210feSCharusso   int *a = (int *)alloca(12);
10089d210feSCharusso   clang_analyzer_dump(a);             // expected-warning {{Element{HeapSymRegion{conj}}
10189d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning {{12 U64b}}
10289d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
10389d210feSCharusso }
10489d210feSCharusso 
symbolic_complex()10589d210feSCharusso void symbolic_complex() {
10689d210feSCharusso   int *a = (int *)malloc(4);
10789d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning {{4 U64b}}
10889d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning {{1 S64b}}
10989d210feSCharusso 
11089d210feSCharusso   int *b = (int *)realloc(a, sizeof(int) * 2);
11189d210feSCharusso   clang_analyzer_dumpExtent(b);       // expected-warning {{8 U64b}}
11289d210feSCharusso   clang_analyzer_dumpElementCount(b); // expected-warning {{2 S64b}}
11389d210feSCharusso   free(b);
11489d210feSCharusso 
11589d210feSCharusso   int *c = (int *)calloc(3, 4);
11689d210feSCharusso   clang_analyzer_dumpExtent(c);       // expected-warning {{12 U64b}}
11789d210feSCharusso   clang_analyzer_dumpElementCount(c); // expected-warning {{3 S64b}}
11889d210feSCharusso   free(c);
11989d210feSCharusso }
12089d210feSCharusso 
signedness_equality()12189d210feSCharusso void signedness_equality() {
12289d210feSCharusso   char *a = new char[sizeof(char) * 13];
12389d210feSCharusso   char *b = (char *)malloc(13);
12489d210feSCharusso 
12589d210feSCharusso   clang_analyzer_dump(clang_analyzer_getExtent(a)); // expected-warning {{13 S64b}}
12689d210feSCharusso   clang_analyzer_dump(clang_analyzer_getExtent(b)); // expected-warning {{13 U64b}}
12789d210feSCharusso   clang_analyzer_eval(clang_analyzer_getExtent(a) ==
12889d210feSCharusso                       clang_analyzer_getExtent(b));
12989d210feSCharusso   // expected-warning@-2 {{TRUE}}
13089d210feSCharusso 
13189d210feSCharusso   delete[] a;
13289d210feSCharusso   free(b);
13389d210feSCharusso }
13489d210feSCharusso 
default_new_aligned()13589d210feSCharusso void default_new_aligned() {
13689d210feSCharusso   struct alignas(32) S {};
13789d210feSCharusso 
13889d210feSCharusso   S *a = new S[10];
13989d210feSCharusso 
14089d210feSCharusso   clang_analyzer_dump(a);             // expected-warning {{Element{HeapSymRegion{conj}}
14189d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning {{320 S64b}}
14289d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning {{10 S64b}}
14389d210feSCharusso 
14489d210feSCharusso   delete[] a;
14589d210feSCharusso }
14689d210feSCharusso 
14789d210feSCharusso void *operator new[](std::size_t, std::align_val_t, bool hack) throw();
14889d210feSCharusso 
user_defined_new()14989d210feSCharusso void user_defined_new() {
15089d210feSCharusso   int *a = new (std::align_val_t(32), true) int[10];
15189d210feSCharusso 
15289d210feSCharusso   clang_analyzer_dump(a);             // expected-warning {{Element{SymRegion{conj}}
15389d210feSCharusso   clang_analyzer_dumpExtent(a);       // expected-warning-re {{{{^extent_\$[0-9]\{SymRegion{conj}}}}
15489d210feSCharusso   clang_analyzer_dumpElementCount(a); // expected-warning-re {{{{^\(extent_\$[0-9]\{SymRegion{conj.*\) / 4}}}}
15589d210feSCharusso 
15689d210feSCharusso   operator delete[](a, std::align_val_t(32));
15789d210feSCharusso }
158