Skip to content

[Clang] -fdump-record-layouts prints in the wrong order #153331

@kon72

Description

@kon72

The offsets of class C2 are out of order.

(This code is taken from https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable-ctor-vtt)

class A1 { int i; };
class A2 { int i; virtual void f(); };
class V1 : public A1, public A2 { int i; };
// A2 is primary base of V1, A1 is non-polymorphic

class B1 { int i; };
class B2 { int i; };
class V2 : public B1, public B2, public virtual V1 { int i; };
// V2 has no primary base, V1 is secondary base

class V3 { virtual void g(); };
class C2 : public virtual V3, public virtual V2 { int i; };

C2 c2;

Actual output:

*** Dumping AST Record Layout
         0 | class V3
         0 |   (V3 vtable pointer)
           | [sizeof=8, dsize=8, align=8,
           |  nvsize=8, nvalign=8]

*** Dumping AST Record Layout
         0 | class B1
         0 |   int i
           | [sizeof=4, dsize=4, align=4,
           |  nvsize=4, nvalign=4]

*** Dumping AST Record Layout
         0 | class B2
         0 |   int i
           | [sizeof=4, dsize=4, align=4,
           |  nvsize=4, nvalign=4]

*** Dumping AST Record Layout
         0 | class A1
         0 |   int i
           | [sizeof=4, dsize=4, align=4,
           |  nvsize=4, nvalign=4]

*** Dumping AST Record Layout
         0 | class A2
         0 |   (A2 vtable pointer)
         8 |   int i
           | [sizeof=16, dsize=12, align=8,
           |  nvsize=12, nvalign=8]

*** Dumping AST Record Layout
         0 | class V1
         0 |   class A2 (primary base)
         0 |     (A2 vtable pointer)
         8 |     int i
        12 |   class A1 (base)
        12 |     int i
        16 |   int i
           | [sizeof=24, dsize=20, align=8,
           |  nvsize=20, nvalign=8]

*** Dumping AST Record Layout
         0 | class V2
         0 |   (V2 vtable pointer)
         8 |   class B1 (base)
         8 |     int i
        12 |   class B2 (base)
        12 |     int i
        16 |   int i
        24 |   class V1 (virtual base)
        24 |     class A2 (primary base)
        24 |       (A2 vtable pointer)
        32 |       int i
        36 |     class A1 (base)
        36 |       int i
        40 |     int i
           | [sizeof=48, dsize=44, align=8,
           |  nvsize=20, nvalign=8]

*** Dumping AST Record Layout
         0 | class C2
         8 |   int i
         0 |   class V3 (primary virtual base)
         0 |     (V3 vtable pointer)
        40 |   class V1 (virtual base)
        40 |     class A2 (primary base)
        40 |       (A2 vtable pointer)
        48 |       int i
        52 |     class A1 (base)
        52 |       int i
        56 |     int i
        16 |   class V2 (virtual base)
        16 |     (V2 vtable pointer)
        24 |     class B1 (base)
        24 |       int i
        28 |     class B2 (base)
        28 |       int i
        32 |     int i
           | [sizeof=64, dsize=60, align=8,
           |  nvsize=12, nvalign=8]

$ /opt/homebrew/opt/llvm/bin/clang -v
Homebrew clang version 20.1.8
Target: arm64-apple-darwin24.5.0
Thread model: posix
InstalledDir: /opt/homebrew/Cellar/llvm/20.1.8/bin
Configuration file: /opt/homebrew/etc/clang/arm64-apple-darwin24.cfg
System configuration file directory: /opt/homebrew/etc/clang
User configuration file directory: /Users/kon/.config/clang

Metadata

Metadata

Assignees

No one assigned

    Labels

    clangClang issues not falling into any other category

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions