// RUN: %check_clang_tidy %s bugprone-sizeof-expression %t -- -config="{CheckOptions: {bugprone-sizeof-expression.WarnOnSizeOfPointerToAggregate: false}}" --
class C {
int size() { return sizeof(this); }
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: suspicious usage of 'sizeof(this)'
};
#pragma pack(1)
struct S { char a, b, c; };
int Test5() {
typedef int Array10[10];
typedef C ArrayC[10];
struct MyStruct {
Array10 arr;
Array10* ptr;
};
typedef const MyStruct TMyStruct;
typedef const MyStruct *PMyStruct;
typedef TMyStruct *PMyStruct2;
static TMyStruct kGlocalMyStruct = {};
static TMyStruct volatile * kGlocalMyStructPtr = &kGlocalMyStruct;
MyStruct S;
PMyStruct PS;
PMyStruct2 PS2;
Array10 A10;
C *PtrArray[10];
C *PC;
int sum = 0;
sum += sizeof(&S.arr);
// No warning.
sum += sizeof(&kGlocalMyStruct.arr);
// No warning.
sum += sizeof(&kGlocalMyStructPtr->arr);
// No warning.
sum += sizeof(S.arr + 0);
// No warning.
sum += sizeof(+ S.arr);
// No warning.
sum += sizeof((int*)S.arr);
// No warning.
sum += sizeof(S.ptr);
// No warning.
sum += sizeof(kGlocalMyStruct.ptr);
// No warning.
sum += sizeof(kGlocalMyStructPtr->ptr);
// No warning.
sum += sizeof(&kGlocalMyStruct);
// No warning.
sum += sizeof(&S);
// No warning.
sum += sizeof(MyStruct*);
sum += sizeof(PMyStruct);
sum += sizeof(PS);
// No warning.
sum += sizeof(PS2);
// No warning.
sum += sizeof(&A10);
// No warning.
sum += sizeof(PtrArray) / sizeof(PtrArray[1]);
// No warning.
sum += sizeof(A10) / sizeof(PtrArray[0]);
// No warning.
sum += sizeof(PC) / sizeof(PtrArray[0]);
// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: suspicious usage of 'sizeof(...)/sizeof(...)'; both expressions have the same type
sum += sizeof(ArrayC) / sizeof(PtrArray[0]);
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: suspicious usage of 'sizeof(...)/sizeof(...)'; numerator is not a multiple of denominator
return sum;
}