| // RUN: %clang_cc1 -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -std=c++20 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s --implicit-check-not "call void @__sanitizer_dtor_callback" |
| // RUN: %clang_cc1 -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -std=c++20 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s --implicit-check-not "call void @__sanitizer_dtor_callback" |
| |
| struct Empty {}; |
| |
| struct EmptyNonTrivial { |
| ~EmptyNonTrivial(); |
| }; |
| |
| struct Trivial { |
| int a; |
| char c; |
| }; |
| static_assert(sizeof(Trivial) == 8); |
| |
| struct NonTrivial { |
| int a; |
| char c; |
| ~NonTrivial(); |
| }; |
| static_assert(sizeof(NonTrivial) == 8); |
| |
| namespace T0 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| char f3; |
| ~Struct(){}; |
| } var; |
| static_assert(sizeof(Struct) == 16); |
| } // namespace T0 |
| // CHECK-LABEL: define {{.*}} @_ZN2T06StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 13) |
| // CHECK-NEXT: ret void |
| |
| namespace empty { |
| namespace T1 { |
| struct Struct { |
| NonTrivial nt; |
| Trivial f1; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T1 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T16StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 13) |
| // CHECK-NEXT: ret void |
| |
| namespace T2 { |
| struct Struct { |
| Trivial f1; |
| NonTrivial nt; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T2 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T26StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 8) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 5) |
| // CHECK-NEXT: ret void |
| |
| namespace T3 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| NonTrivial nt; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T3 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T36StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 12) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 1) |
| // CHECK-NEXT: ret void |
| |
| namespace T4 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| char f3; |
| NonTrivial nt; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T4 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T46StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 16) |
| // CHECK-NEXT: ret void |
| |
| namespace T5 { |
| struct Struct { |
| [[no_unique_address]] Empty e; |
| NonTrivial nt; |
| Trivial f1; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T5 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T56StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 13) |
| // CHECK-NEXT: ret void |
| |
| namespace T6 { |
| struct Struct { |
| NonTrivial nt; |
| [[no_unique_address]] Empty e; |
| Trivial f1; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T6 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T66StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 13) |
| // CHECK-NEXT: ret void |
| |
| namespace T7 { |
| struct Struct { |
| Trivial f1; |
| NonTrivial nt; |
| [[no_unique_address]] Empty e; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T7 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T76StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 8) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 5) |
| // CHECK-NEXT: ret void |
| |
| namespace T8 { |
| struct Struct { |
| Trivial f1; |
| [[no_unique_address]] Empty e; |
| NonTrivial nt; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T8 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T86StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 8) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 5) |
| // CHECK-NEXT: ret void |
| |
| namespace T9 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| NonTrivial nt; |
| [[no_unique_address]] Empty e; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T9 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty2T96StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 12) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 1) |
| // CHECK-NEXT: ret void |
| |
| namespace T10 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| [[no_unique_address]] Empty e; |
| NonTrivial nt; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T10 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty3T106StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 12) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 1) |
| // CHECK-NEXT: ret void |
| |
| namespace T11 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| char f3; |
| NonTrivial nt; |
| [[no_unique_address]] Empty e; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T11 |
| // CHECK-LABEL: define {{.*}} @_ZN5empty3T116StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 16) |
| // CHECK-NEXT: ret void |
| |
| namespace T12 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| char f3; |
| [[no_unique_address]] Empty e; |
| NonTrivial nt; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T12 |
| } // namespace empty |
| // CHECK-LABEL: define {{.*}} @_ZN5empty3T126StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 16) |
| // CHECK-NEXT: ret void |
| |
| namespace empty_non_trivial { |
| namespace T1 { |
| struct Struct { |
| NonTrivial nt; |
| Trivial f1; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T1 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T16StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 13) |
| // CHECK-NEXT: ret void |
| |
| namespace T2 { |
| struct Struct { |
| Trivial f1; |
| NonTrivial nt; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T2 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T26StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 8) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 5) |
| // CHECK-NEXT: ret void |
| |
| namespace T3 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| NonTrivial nt; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T3 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T36StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 12) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 1) |
| // CHECK-NEXT: ret void |
| |
| namespace T4 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| char f3; |
| NonTrivial nt; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T4 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T46StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 16) |
| // CHECK-NEXT: ret void |
| |
| namespace T5 { |
| struct Struct { |
| [[no_unique_address]] EmptyNonTrivial e; |
| NonTrivial nt; |
| Trivial f1; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T5 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T56StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 13) |
| // CHECK-NEXT: ret void |
| |
| namespace T6 { |
| struct Struct { |
| NonTrivial nt; |
| [[no_unique_address]] EmptyNonTrivial e; |
| Trivial f1; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T6 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T66StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 13) |
| // CHECK-NEXT: ret void |
| |
| namespace T7 { |
| struct Struct { |
| Trivial f1; |
| NonTrivial nt; |
| [[no_unique_address]] EmptyNonTrivial e; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T7 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T76StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 8) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 5) |
| // CHECK-NEXT: ret void |
| |
| namespace T8 { |
| struct Struct { |
| Trivial f1; |
| [[no_unique_address]] EmptyNonTrivial e; |
| NonTrivial nt; |
| int f2; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T8 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T86StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 8) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 5) |
| // CHECK-NEXT: ret void |
| |
| namespace T9 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| NonTrivial nt; |
| [[no_unique_address]] EmptyNonTrivial e; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T9 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial2T96StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 12) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 1) |
| // CHECK-NEXT: ret void |
| |
| namespace T10 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| [[no_unique_address]] EmptyNonTrivial e; |
| NonTrivial nt; |
| char f3; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T10 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial3T106StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 12) |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 1) |
| // CHECK-NEXT: ret void |
| |
| namespace T11 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| char f3; |
| NonTrivial nt; |
| [[no_unique_address]] EmptyNonTrivial e; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T11 |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial3T116StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 16) |
| // CHECK-NEXT: ret void |
| |
| namespace T12 { |
| struct Struct { |
| Trivial f1; |
| int f2; |
| char f3; |
| [[no_unique_address]] EmptyNonTrivial e; |
| NonTrivial nt; |
| } var; |
| static_assert(sizeof(Struct) == 24); |
| } // namespace T12 |
| } // namespace empty_non_trivial |
| // CHECK-LABEL: define {{.*}} @_ZN17empty_non_trivial3T126StructD2Ev( |
| // CHECK: call void @__sanitizer_dtor_callback(i8* {{.*}}, i64 16) |
| // CHECK: ret void |