1 // RUN: %check_clang_tidy %s bugprone-sizeof-expression %t -- -config="{CheckOptions: {bugprone-sizeof-expression.WarnOnSizeOfPointerToAggregate: false}}" --
2 
3 class C {
size()4   int size() { return sizeof(this); }
5   // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: suspicious usage of 'sizeof(this)'
6 };
7 
8 #pragma pack(1)
9 struct  S { char a, b, c; };
10 
Test5()11 int Test5() {
12   typedef int Array10[10];
13   typedef C ArrayC[10];
14 
15   struct MyStruct {
16     Array10 arr;
17     Array10* ptr;
18   };
19   typedef const MyStruct TMyStruct;
20   typedef const MyStruct *PMyStruct;
21   typedef TMyStruct *PMyStruct2;
22 
23   static TMyStruct kGlocalMyStruct = {};
24   static TMyStruct volatile * kGlocalMyStructPtr = &kGlocalMyStruct;
25 
26   MyStruct S;
27   PMyStruct PS;
28   PMyStruct2 PS2;
29   Array10 A10;
30   C *PtrArray[10];
31   C *PC;
32 
33   int sum = 0;
34   sum += sizeof(&S.arr);
35   // No warning.
36   sum += sizeof(&kGlocalMyStruct.arr);
37   // No warning.
38   sum += sizeof(&kGlocalMyStructPtr->arr);
39   // No warning.
40   sum += sizeof(S.arr + 0);
41   // No warning.
42   sum += sizeof(+ S.arr);
43   // No warning.
44   sum += sizeof((int*)S.arr);
45   // No warning.
46 
47   sum += sizeof(S.ptr);
48   // No warning.
49   sum += sizeof(kGlocalMyStruct.ptr);
50   // No warning.
51   sum += sizeof(kGlocalMyStructPtr->ptr);
52   // No warning.
53 
54   sum += sizeof(&kGlocalMyStruct);
55   // No warning.
56   sum += sizeof(&S);
57   // No warning.
58   sum += sizeof(MyStruct*);
59   sum += sizeof(PMyStruct);
60   sum += sizeof(PS);
61   // No warning.
62   sum += sizeof(PS2);
63   // No warning.
64   sum += sizeof(&A10);
65   // No warning.
66   sum += sizeof(PtrArray) / sizeof(PtrArray[1]);
67   // No warning.
68   sum += sizeof(A10) / sizeof(PtrArray[0]);
69   // No warning.
70   sum += sizeof(PC) / sizeof(PtrArray[0]);
71   // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: suspicious usage of 'sizeof(...)/sizeof(...)'; both expressions have the same type
72   sum += sizeof(ArrayC) / sizeof(PtrArray[0]);
73   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: suspicious usage of 'sizeof(...)/sizeof(...)'; numerator is not a multiple of denominator
74 
75   return sum;
76 }
77