diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -1187,11 +1187,10 @@ // Query the external layout to see if it provides an offset. bool HasExternalLayout = false; if (UseExternalLayout) { - // FIXME: This appears to be reversed. if (Base->IsVirtual) - HasExternalLayout = External.getExternalNVBaseOffset(Base->Class, Offset); - else HasExternalLayout = External.getExternalVBaseOffset(Base->Class, Offset); + else + HasExternalLayout = External.getExternalNVBaseOffset(Base->Class, Offset); } // Clang <= 6 incorrectly applied the 'packed' attribute to base classes. diff --git a/lldb/test/API/lang/cpp/alignas_base_class/Makefile b/lldb/test/API/lang/cpp/alignas_base_class/Makefile new file mode 100644 --- /dev/null +++ b/lldb/test/API/lang/cpp/alignas_base_class/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules diff --git a/lldb/test/API/lang/cpp/alignas_base_class/TestAlignAsBaseClass.py b/lldb/test/API/lang/cpp/alignas_base_class/TestAlignAsBaseClass.py new file mode 100644 --- /dev/null +++ b/lldb/test/API/lang/cpp/alignas_base_class/TestAlignAsBaseClass.py @@ -0,0 +1,16 @@ +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class TestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @no_debug_info_test + def test(self): + self.build() + self.dbg.CreateTarget(self.getBuildArtifact("a.out")) + + # The offset of f2 should be 8 because of `alignas(8)`. + self.expect_expr("(intptr_t)&d3g.f2 - (intptr_t)&d3g", result_value="8") diff --git a/lldb/test/API/lang/cpp/alignas_base_class/main.cpp b/lldb/test/API/lang/cpp/alignas_base_class/main.cpp new file mode 100644 --- /dev/null +++ b/lldb/test/API/lang/cpp/alignas_base_class/main.cpp @@ -0,0 +1,13 @@ +struct B1 { + char f1; +}; + +struct alignas(8) B2 { + char f2; +}; + +struct D : B1, B2 {}; + +D d3g; + +int main() {}