1// RUN: %check_clang_tidy %s bugprone-sizeof-expression %t -- --
2// RUN: %check_clang_tidy %s bugprone-sizeof-expression %t -- -- -x c++
3
4#ifdef __cplusplus
5#define STRKWD
6#else
7#define STRKWD struct
8#endif
9
10int Test5() {
11 typedef int Array10[10];
12
13 struct MyStruct {
14 Array10 arr;
15 Array10* ptr;
16 };
17
18 typedef struct TypedefStruct {
19 Array10 arr;
20 Array10* ptr;
21 } TypedefStruct;
22
23 typedef const STRKWD MyStruct TMyStruct;
24 typedef const STRKWD MyStruct *PMyStruct;
25 typedef TMyStruct *PMyStruct2;
26 typedef const TypedefStruct *PTTStruct;
27
28 STRKWD MyStruct S;
29 TypedefStruct TS;
30 PMyStruct PS;
31 PMyStruct2 PS2;
32 Array10 A10;
33 PTTStruct PTTS;
34
35 int sum = 0;
36 sum += sizeof(&S);
37 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate
38 sum += sizeof(__typeof(&S));
39 sum += sizeof(&TS);
40 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate
41 sum += sizeof(__typeof(&TS));
42 sum += sizeof(STRKWD MyStruct*);
43 sum += sizeof(__typeof(STRKWD MyStruct*));
44 sum += sizeof(TypedefStruct*);
45 sum += sizeof(__typeof(TypedefStruct*));
46 sum += sizeof(PTTS);
47 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate
48 sum += sizeof(PMyStruct);
49 sum += sizeof(PS);
50 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate
51 sum += sizeof(PS2);
52 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate
53 sum += sizeof(&A10);
54 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate
55
56#ifdef __cplusplus
57 MyStruct &rS = S;
58 sum += sizeof(rS); // same as sizeof(S), not a pointer. So should not warn.
59#endif
60
61 return sum;
62}
63

source code of clang-tools-extra/test/clang-tidy/checkers/bugprone/sizeof-expression-2.c