mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 13:36:08 +00:00

This implements the rule intended by the standard (see LWG 2358) and the rule intended by the Itanium C++ ABI (see https://github.com/itanium-cxx-abi/cxx-abi/pull/51), and makes Clang match the behavior of GCC, ICC, and MSVC. A pedantic reading of both the standard and the ABI indicate that Clang is currently technically correct, but that's not worth much when it's clear that the wording is wrong in both those places. This is an ABI break for classes that derive from a class that is empty other than one or more unnamed non-zero-length bit-fields. Such cases are expected to be rare, but -fclang-abi-compat=6 restores the old behavior just in case. Differential Revision: https://reviews.llvm.org/D45174 llvm-svn: 331620
21 lines
1001 B
C++
21 lines
1001 B
C++
// RUN: %clang_cc1 -fsyntax-only -fclang-abi-compat=6 -triple x86_64-linux-gnu -fdump-record-layouts %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-V6
|
|
// RUN: %clang_cc1 -fsyntax-only -fclang-abi-compat=7 -triple x86_64-linux-gnu -fdump-record-layouts %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-V7
|
|
|
|
// In Clang 6 and before, we determined that Nonempty was empty, so we
|
|
// applied EBO to it.
|
|
struct Nonempty { int : 4; };
|
|
struct A : Nonempty { int n; };
|
|
int k = sizeof(A);
|
|
|
|
// CHECK:*** Dumping AST Record Layout
|
|
// CHECK: 0 | struct A
|
|
// CHECK-V6-NEXT: 0 | struct Nonempty (base) (empty)
|
|
// CHECK-V7-NEXT: 0 | struct Nonempty (base){{$}}
|
|
// CHECK-NEXT: 0:0-3 | int
|
|
// CHECK-V6-NEXT: 0 | int n
|
|
// CHECK-V7-NEXT: 4 | int n
|
|
// CHECK-V6-NEXT: | [sizeof=4, dsize=4, align=4,
|
|
// CHECK-V6-NEXT: | nvsize=4, nvalign=4]
|
|
// CHECK-V7-NEXT: | [sizeof=8, dsize=8, align=4,
|
|
// CHECK-V7-NEXT: | nvsize=8, nvalign=4]
|