Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,12 @@ Attribute Changes in Clang

- Clang now disallows the use of attributes after the namespace name. (#GH121407)

- On targets with Itanium C++ ABI, Clang now supports ``[[gnu:gcc_struct]]``
with the behavior similar to one existing in GCC. In particular, whenever
``-mms-bitfields`` command line option is provided (or if Microsoft-compatible
structure layout is default on the target), ``[[gnu::gcc_struct]]`` requests
the compiler to follow Itanium rules for the layout of an annotated structure.

Improvements to Clang's diagnostics
-----------------------------------

Expand Down
8 changes: 8 additions & 0 deletions clang/include/clang/AST/ASTContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -2610,6 +2610,14 @@ class ASTContext : public RefCountedBase<ASTContext> {
/// runtime, such as those using the Itanium C++ ABI.
CharUnits getExnObjectAlignment() const;

/// Return whether getASTRecordLayout will use MicrosoftRecordLayoutBuilder
/// or ItaniumRecordLayoutBuilder.
bool isMicrosoftLayout() const;

/// Return whether unannotated records are treated as if they have
/// [[gnu::ms_struct]].
bool defaultsToMsStruct() const;

/// Get or compute information about the layout of the specified
/// record (struct/union/class) \p D, which indicates its size and field
/// position information.
Expand Down
9 changes: 8 additions & 1 deletion clang/include/clang/Basic/Attr.td
Original file line number Diff line number Diff line change
Expand Up @@ -4130,7 +4130,14 @@ def CFGuard : InheritableAttr, TargetSpecificAttr<TargetWindows> {
def MSStruct : InheritableAttr {
let Spellings = [GCC<"ms_struct">];
let Subjects = SubjectList<[Record]>;
let Documentation = [Undocumented];
let Documentation = [MSStructDocs];
let SimpleHandler = 1;
}

def GCCStruct : InheritableAttr {
let Spellings = [GCC<"gcc_struct">];
let Subjects = SubjectList<[Record]>;
let Documentation = [MSStructDocs]; // Covers this attribute too.
let SimpleHandler = 1;
}

Expand Down
16 changes: 16 additions & 0 deletions clang/include/clang/Basic/AttrDocs.td
Original file line number Diff line number Diff line change
Expand Up @@ -8943,3 +8943,19 @@ Declares that a function potentially allocates heap memory, and prevents any pot
of ``nonallocating`` by the compiler.
}];
}

def MSStructDocs : Documentation {
let Category = DocCatDecl;
let Content = [{
The ``ms_struct`` and ``gcc_struct`` attributes request the compiler to enter a
special record layout compatibility mode which mimics the layout of Microsoft or
Itanium C++ ABI respectively. Obviously, if the current C++ ABI matches the
requested ABI, the attribute does nothing. However, if it does not, annotated
structure or class is laid out in a special compatibility mode, which slightly
changes offsets for fields and bit-fields. The intention is to match the layout
of the requested ABI for structures which only use C features.

Note that the default behavior can be controlled by ``-mms-bitfields`` and
``-mno-ms-bitfields`` switches and via ``#pragma ms_struct``.
}];
}
3 changes: 3 additions & 0 deletions clang/include/clang/Basic/DiagnosticASTKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,9 @@ def warn_npot_ms_struct : Warning<
"data types with sizes that aren't a power of two">,
DefaultError, InGroup<IncompatibleMSStruct>;

def err_itanium_layout_unimplemented : Error<
"Itanium-compatible layout for the Microsoft C++ ABI is not yet supported">;

// -Wpadded-bitfield
def warn_padded_struct_bitfield : Warning<
"padding %select{struct|interface|class}0 %1 with %2 "
Expand Down
3 changes: 2 additions & 1 deletion clang/include/clang/Basic/LangOptions.def
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,8 @@ LANGOPT(AssumeNothrowExceptionDtor , 1, 0, "Assume exception object's destructor
LANGOPT(TraditionalCPP , 1, 0, "traditional CPP emulation")
LANGOPT(RTTI , 1, 1, "run-time type information")
LANGOPT(RTTIData , 1, 1, "emit run-time type information data")
LANGOPT(MSBitfields , 1, 0, "Microsoft-compatible structure layout")
ENUM_LANGOPT(LayoutCompatibility, LayoutCompatibilityKind, 2,
LayoutCompatibilityKind::Default, "Microsoft-compatible structure layout")
LANGOPT(MSVolatile , 1, 0, "Microsoft-compatible volatile loads and stores")
LANGOPT(Freestanding, 1, 0, "freestanding implementation")
LANGOPT(NoBuiltin , 1, 0, "disable builtin functions")
Expand Down
10 changes: 10 additions & 0 deletions clang/include/clang/Basic/LangOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,16 @@ class LangOptionsBase {
None,
};

enum class LayoutCompatibilityKind {
/// Use default layout rules of the target.
Default = 0,
/// Use Itanium rules for bit-field layout and fundamental types alignment.
Itanium = 1,
/// Use Microsoft C++ ABI rules for bit-field layout and fundamental types
/// alignment.
Microsoft = 2,
};

// Define simple language options (with no accessors).
#define LANGOPT(Name, Bits, Default, Description) unsigned Name : Bits;
#define ENUM_LANGOPT(Name, Type, Bits, Default, Description)
Expand Down
10 changes: 7 additions & 3 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -4861,9 +4861,7 @@ def mmacos_version_min_EQ : Joined<["-"], "mmacos-version-min=">,
def : Joined<["-"], "mmacosx-version-min=">,
Group<m_Group>, Alias<mmacos_version_min_EQ>;
def mms_bitfields : Flag<["-"], "mms-bitfields">, Group<m_Group>,
Visibility<[ClangOption, CC1Option]>,
HelpText<"Set the default structure layout to be compatible with the Microsoft compiler standard">,
MarshallingInfoFlag<LangOpts<"MSBitfields">>;
HelpText<"Set the default structure layout to be compatible with the Microsoft compiler standard">;
Copy link
Member

@MaskRay MaskRay Nov 28, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Driver and Frontend changes seem unneeded? -mno-ms-bitfields can remain a driver-only option that is not in CC1.

It's a convention that Driver supports both -mxxx and -mno-xxx while only one is supported by CC1.

Copy link
Contributor Author

@DanShaders DanShaders Nov 28, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once again, yes, I can theoretically use BoolOption and leave everything as it is. However, this requires computing default value for -mms-bitfields in driver, which is possible but will result in code duplication and is in general less clean that the current solution. I provided some more details in the reply to rjmccall above.

In case you are strongly against breaking the convention, I can alteranatively make both -mms-bitfields and -mno-ms-bitfields driver-only options and invent a new enum option for cc1 along the lines of -flayout-compatiblity-type={default,microsoft,itanium}. I should note that this would only slightly change the way I pass arguments from the driver to cc1.

def moutline : Flag<["-"], "moutline">, Group<f_clang_Group>,
Visibility<[ClangOption, CC1Option]>,
HelpText<"Enable function outlining (AArch64 only)">;
Expand All @@ -4872,6 +4870,12 @@ def mno_outline : Flag<["-"], "mno-outline">, Group<f_clang_Group>,
HelpText<"Disable function outlining (AArch64 only)">;
def mno_ms_bitfields : Flag<["-"], "mno-ms-bitfields">, Group<m_Group>,
HelpText<"Do not set the default structure layout to be compatible with the Microsoft compiler standard">;
def fms_layout_compatibility_EQ : Joined<["-"], "fms-layout-compatibility=">,
Visibility<[CC1Option]>,
HelpText<"Structure layout compatibility with Microsoft C++ ABI">,
Values<"default,itanium,microsoft">,
NormalizedValues<["Default", "Itanium", "Microsoft"]>, NormalizedValuesScope<"LangOptions::LayoutCompatibilityKind">,
MarshallingInfoEnum<LangOpts<"LayoutCompatibility">, "Default">;
def mskip_rax_setup : Flag<["-"], "mskip-rax-setup">, Group<m_Group>,
Visibility<[ClangOption, CC1Option]>,
HelpText<"Skip setting up RAX register when passing variable arguments (x86 only)">,
Expand Down
9 changes: 8 additions & 1 deletion clang/lib/AST/Decl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5125,7 +5125,14 @@ void RecordDecl::completeDefinition() {
/// This which can be turned on with an attribute, pragma, or the
/// -mms-bitfields command-line option.
bool RecordDecl::isMsStruct(const ASTContext &C) const {
return hasAttr<MSStructAttr>() || C.getLangOpts().MSBitfields == 1;
if (hasAttr<GCCStructAttr>())
return false;
if (hasAttr<MSStructAttr>())
return true;
auto LayoutCompatibility = C.getLangOpts().getLayoutCompatibility();
if (LayoutCompatibility == LangOptions::LayoutCompatibilityKind::Default)
return C.defaultsToMsStruct();
return LayoutCompatibility == LangOptions::LayoutCompatibilityKind::Microsoft;
}

void RecordDecl::reorderDecls(const SmallVectorImpl<Decl *> &Decls) {
Expand Down
37 changes: 24 additions & 13 deletions clang/lib/AST/RecordLayoutBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2443,15 +2443,6 @@ static bool mustSkipTailPadding(TargetCXXABI ABI, const CXXRecordDecl *RD) {
llvm_unreachable("bad tail-padding use kind");
}

static bool isMsLayout(const ASTContext &Context) {
// Check if it's CUDA device compilation; ensure layout consistency with host.
if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
return Context.getAuxTargetInfo()->getCXXABI().isMicrosoft();

return Context.getTargetInfo().getCXXABI().isMicrosoft();
}

// This section contains an implementation of struct layout that is, up to the
// included tests, compatible with cl.exe (2013). The layout produced is
// significantly different than those produced by the Itanium ABI. Here we note
Expand Down Expand Up @@ -2793,6 +2784,13 @@ void MicrosoftRecordLayoutBuilder::initializeLayout(const RecordDecl *RD) {
UseExternalLayout = Source->layoutRecordType(
RD, External.Size, External.Align, External.FieldOffsets,
External.BaseOffsets, External.VirtualBaseOffsets);

if (!RD->isMsStruct(Context)) {
auto Location = RD->getLocation();
if (Location.isValid())
Context.getDiagnostics().Report(Location,
diag::err_itanium_layout_unimplemented);
}
}

void
Expand Down Expand Up @@ -3314,6 +3312,19 @@ void MicrosoftRecordLayoutBuilder::computeVtorDispSet(
}
}

bool ASTContext::isMicrosoftLayout() const {
// Check if it's CUDA device compilation; ensure layout consistency with host.
if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice && getAuxTargetInfo())
return getAuxTargetInfo()->getCXXABI().isMicrosoft();

return getTargetInfo().getCXXABI().isMicrosoft();
}

bool ASTContext::defaultsToMsStruct() const {
return isMicrosoftLayout() ||
getTargetInfo().getTriple().isWindowsGNUEnvironment();
}

/// getASTRecordLayout - Get or compute information about the layout of the
/// specified record (struct/union/class), which indicates its size and field
/// position information.
Expand Down Expand Up @@ -3342,7 +3353,7 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {

const ASTRecordLayout *NewEntry = nullptr;

if (isMsLayout(*this)) {
if (isMicrosoftLayout()) {
if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
EmptySubobjectMap EmptySubobjects(*this, RD);
MicrosoftRecordLayoutBuilder Builder(*this, &EmptySubobjects);
Expand Down Expand Up @@ -3618,7 +3629,7 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,
bool HasOwnVBPtr = Layout.hasOwnVBPtr();

// Vtable pointer.
if (CXXRD->isDynamicClass() && !PrimaryBase && !isMsLayout(C)) {
if (CXXRD->isDynamicClass() && !PrimaryBase && !C.isMicrosoftLayout()) {
PrintOffset(OS, Offset, IndentLevel);
OS << '(' << *RD << " vtable pointer)\n";
} else if (HasOwnVFPtr) {
Expand Down Expand Up @@ -3716,7 +3727,7 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,

PrintIndentNoOffset(OS, IndentLevel - 1);
OS << "[sizeof=" << Layout.getSize().getQuantity();
if (CXXRD && !isMsLayout(C))
if (CXXRD && !C.isMicrosoftLayout())
OS << ", dsize=" << Layout.getDataSize().getQuantity();
OS << ", align=" << Layout.getAlignment().getQuantity();
if (C.getTargetInfo().defaultsToAIXPowerAlignment())
Expand Down Expand Up @@ -3755,7 +3766,7 @@ void ASTContext::DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,
OS << "\nLayout: ";
OS << "<ASTRecordLayout\n";
OS << " Size:" << toBits(Info.getSize()) << "\n";
if (!isMsLayout(*this))
if (!isMicrosoftLayout())
OS << " DataSize:" << toBits(Info.getDataSize()) << "\n";
OS << " Alignment:" << toBits(Info.getAlignment()) << "\n";
if (Target->defaultsToAIXPowerAlignment())
Expand Down
10 changes: 7 additions & 3 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6113,9 +6113,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
if (KernelOrKext && RawTriple.isOSDarwin())
CmdArgs.push_back("-fforbid-guard-variables");

if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
Triple.isWindowsGNUEnvironment())) {
CmdArgs.push_back("-mms-bitfields");
if (Args.hasArg(options::OPT_mms_bitfields) ||
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the LangOption default varies across targets, and you want to forward the driver option to clang -cc1,

if (auto *A = Args.getLastArg(..., ...)) {
  if (A->matches(...)) CmdArgs.push_back...
  else CmdArgs.push_back...
}

Args.hasArg(options::OPT_mno_ms_bitfields)) {
if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
false))
CmdArgs.push_back("-fms-layout-compatibility=microsoft");
else
CmdArgs.push_back("-fms-layout-compatibility=itanium");
}

if (Triple.isWindowsGNUEnvironment()) {
Expand Down
4 changes: 1 addition & 3 deletions clang/lib/Sema/SemaDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18336,9 +18336,7 @@ ExprResult Sema::VerifyBitField(SourceLocation FieldLoc,
// ABI.
bool CStdConstraintViolation =
BitfieldIsOverwide && !getLangOpts().CPlusPlus;
bool MSBitfieldViolation =
Value.ugt(TypeStorageSize) &&
(IsMsStruct || Context.getTargetInfo().getCXXABI().isMicrosoft());
bool MSBitfieldViolation = Value.ugt(TypeStorageSize) && IsMsStruct;
if (CStdConstraintViolation || MSBitfieldViolation) {
unsigned DiagWidth =
CStdConstraintViolation ? TypeWidth : TypeStorageSize;
Expand Down
27 changes: 17 additions & 10 deletions clang/lib/Sema/SemaDeclCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7131,20 +7131,27 @@ void Sema::CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record) {
CheckCompletedMemberFunction(MD);
}

// ms_struct is a request to use the same ABI rules as MSVC. Check
// whether this class uses any C++ features that are implemented
// completely differently in MSVC, and if so, emit a diagnostic.
// That diagnostic defaults to an error, but we allow projects to
// map it down to a warning (or ignore it). It's a fairly common
// practice among users of the ms_struct pragma to mass-annotate
// headers, sweeping up a bunch of types that the project doesn't
// really rely on MSVC-compatible layout for. We must therefore
// support "ms_struct except for C++ stuff" as a secondary ABI.
// {ms,gcc}_struct is a request to change ABI rules to either follow
// Microsoft or Itanium C++ ABI. However, even if these attributes are
// present, we do not layout classes following foreign ABI rules, but
// instead enter a special "compatibility mode", which only changes
// alignments of fundamental types and layout of bit fields.
// Check whether this class uses any C++ features that are implemented
// completely differently in the requested ABI, and if so, emit a
// diagnostic. That diagnostic defaults to an error, but we allow
// projects to map it down to a warning (or ignore it). It's a fairly
// common practice among users of the ms_struct pragma to
// mass-annotate headers, sweeping up a bunch of types that the
// project doesn't really rely on MSVC-compatible layout for. We must
// therefore support "ms_struct except for C++ stuff" as a secondary
// ABI.
// Don't emit this diagnostic if the feature was enabled as a
// language option (as opposed to via a pragma or attribute), as
// the option -mms-bitfields otherwise essentially makes it impossible
// to build C++ code, unless this diagnostic is turned off.
if (Record->isMsStruct(Context) && !Context.getLangOpts().MSBitfields &&
if (Context.getLangOpts().getLayoutCompatibility() ==
LangOptions::LayoutCompatibilityKind::Default &&
Record->isMsStruct(Context) != Context.defaultsToMsStruct() &&
(Record->isPolymorphic() || Record->getNumBases())) {
Diag(Record->getLocation(), diag::warn_cxx_ms_struct);
}
Expand Down
6 changes: 6 additions & 0 deletions clang/test/CodeGen/gcc_struct-msvc-todo-1.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-windows-msvc -verify %s

// expected-error@+1 {{Itanium-compatible layout for the Microsoft C++ ABI is not yet supported}}
struct {
int a;
} __attribute__((gcc_struct)) t1;
6 changes: 6 additions & 0 deletions clang/test/CodeGen/gcc_struct-msvc-todo-2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-windows-msvc -fms-layout-compatibility=itanium -verify %s

// expected-error@+1 {{Itanium-compatible layout for the Microsoft C++ ABI is not yet supported}}
struct {
int a;
} t1;
18 changes: 18 additions & 0 deletions clang/test/CodeGen/gcc_struct.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-linux-gnu %s
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-linux-gnu -fms-layout-compatibility=microsoft %s
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-windows-gnu %s
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-windows-gnu -fms-layout-compatibility=itanium %s

struct {
int a : 24;
char b : 8;
} __attribute__((gcc_struct)) t1;
_Static_assert(sizeof(t1) == 4, "");

#pragma ms_struct on
struct {
int a : 24;
char b : 8;
} __attribute__((gcc_struct)) t2;
_Static_assert(sizeof(t2) == 4, "");
#pragma ms_struct off
2 changes: 1 addition & 1 deletion clang/test/CodeGen/mingw-long-double.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -o - %s \
// RUN: | FileCheck %s --check-prefix=GNU32
// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -o - %s -mms-bitfields \
// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -o - %s -fms-layout-compatibility=microsoft \
// RUN: | FileCheck %s --check-prefix=GNU32
// RUN: %clang_cc1 -triple x86_64-windows-gnu -emit-llvm -o - %s \
// RUN: | FileCheck %s --check-prefix=GNU64
Expand Down
2 changes: 1 addition & 1 deletion clang/test/CodeGen/mms-bitfields.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// RUN: %clang_cc1 -triple i386-apple-darwin10 -mms-bitfields -emit-llvm %s -o - | FileCheck %s
// RUN: %clang_cc1 -triple i386-apple-darwin10 -fms-layout-compatibility=microsoft -emit-llvm %s -o - | FileCheck %s

struct s1 {
int f32;
Expand Down
19 changes: 13 additions & 6 deletions clang/test/Driver/ms-bitfields.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
// RUN: %clang -### --target=x86_64-linux-gnu %s 2>&1 | FileCheck %s -check-prefix=NO-MSBITFIELDS
// RUN: %clang -### --target=x86_64-windows-gnu %s 2>&1 | FileCheck %s -check-prefix=MSBITFIELDS
// RUN: %clang -### -mno-ms-bitfields -mms-bitfields %s 2>&1 | FileCheck %s -check-prefix=MSBITFIELDS
// RUN: %clang -### -mms-bitfields -mno-ms-bitfields %s 2>&1 | FileCheck %s -check-prefix=NO-MSBITFIELDS
// RUN: %clang -### --target=x86_64-linux-gnu %s 2>&1 | FileCheck %s -check-prefix=DEFAULT-LAYOUT
// RUN: %clang -### --target=x86_64-windows-gnu %s 2>&1 | FileCheck %s -check-prefix=DEFAULT-LAYOUT
// RUN: %clang -### --target=x86_64-windows-msvc %s 2>&1 | FileCheck %s -check-prefix=DEFAULT-LAYOUT
// RUN: %clang -### -mms-bitfields %s 2>&1 | FileCheck %s -check-prefix=MICROSOFT-LAYOUT
// RUN: %clang -### -mno-ms-bitfields %s 2>&1 | FileCheck %s -check-prefix=ITANIUM-LAYOUT
// RUN: %clang -### -mno-ms-bitfields -mms-bitfields %s 2>&1 | FileCheck %s -check-prefix=MICROSOFT-LAYOUT
// RUN: %clang -### -mms-bitfields -mno-ms-bitfields %s 2>&1 | FileCheck %s -check-prefix=ITANIUM-LAYOUT

// MSBITFIELDS: -mms-bitfields
// NO-MSBITFIELDS-NOT: -mms-bitfields
// DEFAULT-LAYOUT-NOT: -fms-layout-compatibility=itanium
// DEFAULT-LAYOUT-NOT: -fms-layout-compatibility=microsoft
// MICROSOFT-LAYOUT: -fms-layout-compatibility=microsoft
// MICROSOFT-LAYOUT-NOT: -fms-layout-compatibility=itanium
// ITANIUM-LAYOUT: -fms-layout-compatibility=itanium
// ITANIUM-LAYOUT-NOT: -fms-layout-compatibility=microsoft

2 changes: 1 addition & 1 deletion clang/test/Layout/itanium-union-bitfield.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// RUN: %clang_cc1 -emit-llvm-only -triple %itanium_abi_triple -fdump-record-layouts %s 2>/dev/null \
// RUN: %clang_cc1 -emit-llvm-only -triple %itanium_abi_triple -fms-layout-compatibility=itanium -fdump-record-layouts %s 2>/dev/null \
// RUN: | FileCheck %s

// On z/OS, a bit-field has single byte alignment. Add aligned(4) on z/OS so the union has
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
// CHECK-NEXT: FlagEnum (SubjectMatchRule_enum)
// CHECK-NEXT: Flatten (SubjectMatchRule_function)
// CHECK-NEXT: FunctionReturnThunks (SubjectMatchRule_function)
// CHECK-NEXT: GCCStruct (SubjectMatchRule_record)
// CHECK-NEXT: GNUInline (SubjectMatchRule_function)
// CHECK-NEXT: HIPManaged (SubjectMatchRule_variable)
// CHECK-NEXT: Hot (SubjectMatchRule_function)
Expand Down
2 changes: 1 addition & 1 deletion clang/test/Sema/mms-bitfields.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// RUN: %clang_cc1 -mms-bitfields -fsyntax-only -verify -triple x86_64-apple-darwin9 %s
// RUN: %clang_cc1 -fms-layout-compatibility=microsoft -fsyntax-only -verify -triple x86_64-apple-darwin9 %s
// expected-no-diagnostics

// The -mms-bitfields commandline parameter should behave the same
Expand Down
2 changes: 1 addition & 1 deletion clang/test/SemaCXX/ms_struct.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// RUN: %clang_cc1 -fsyntax-only -DTEST_FOR_WARNING -Wno-error=incompatible-ms-struct -verify -triple i686-apple-darwin9 -std=c++11 %s
// RUN: %clang_cc1 -fsyntax-only -DTEST_FOR_WARNING -Wno-error=incompatible-ms-struct -verify -triple armv7-apple-darwin9 -std=c++11 %s
// RUN: %clang_cc1 -fsyntax-only -DTEST_FOR_ERROR -verify -triple armv7-apple-darwin9 -std=c++11 %s
// RUN: %clang_cc1 -fsyntax-only -DNO_PRAGMA -mms-bitfields -verify -triple armv7-apple-darwin9 -std=c++11 %s
// RUN: %clang_cc1 -fsyntax-only -DNO_PRAGMA -fms-layout-compatibility=microsoft -verify -triple armv7-apple-darwin9 -std=c++11 %s

#ifndef NO_PRAGMA
#pragma ms_struct on
Expand Down
2 changes: 1 addition & 1 deletion clang/test/SemaCXX/ms_wide_bitfield.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// RUN: %clang_cc1 -fno-rtti -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -mms-bitfields -verify %s 2>&1
// RUN: %clang_cc1 -fno-rtti -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -fms-layout-compatibility=microsoft -verify %s 2>&1

struct A {
char a : 9; // expected-error{{width of bit-field 'a' (9 bits) exceeds the size of its type (8 bits)}}
Expand Down
Loading
Loading