summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShafik Yaghmour <syaghmour@apple.com>2019-04-26 18:51:28 +0000
committerShafik Yaghmour <syaghmour@apple.com>2019-04-26 18:51:28 +0000
commit16b90733c751ccf80e2c6e31838dc6f1a4f3d38e (patch)
tree15a4be2b8b576e1e4a16aa6e6dc5dbd47388dac9
parent7ab164c4a427b559a7a47fa62ef365862705f950 (diff)
downloadbcm5719-llvm-16b90733c751ccf80e2c6e31838dc6f1a4f3d38e.tar.gz
bcm5719-llvm-16b90733c751ccf80e2c6e31838dc6f1a4f3d38e.zip
[ASTImporter] Copy Argument Passing Restrictions setting when importing a CXXRecordDecl definition
Summary: For a CXXRecordDecl the RecordDeclBits are stored in the DeclContext. Currently when we import the definition of a CXXRecordDecl via the ASTImporter we do not copy over this data. This change will add support for copying the ArgPassingRestrictions from RecordDeclBits to fix an LLDB expression parsing bug where we would set it to not pass in registers. Note, we did not copy over any other of the RecordDeclBits since we don't have tests for those. We know that copying over LoadedFieldsFromExternalStorage would be a error and that may be the case for others as well. The companion LLDB review: https://reviews.llvm.org/D61146 Differential Review: https://reviews.llvm.org/D61140 llvm-svn: 359338
-rw-r--r--clang/lib/AST/ASTImporter.cpp3
-rw-r--r--clang/test/Import/cxx-record-flags/Inputs/F.cpp9
-rw-r--r--clang/test/Import/cxx-record-flags/test.cpp14
3 files changed, 26 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index db956561e93..b4c04284055 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -1767,6 +1767,9 @@ Error ASTNodeImporter::ImportDefinition(
ToData.HasDeclaredCopyAssignmentWithConstParam
= FromData.HasDeclaredCopyAssignmentWithConstParam;
+ // Copy over the data stored in RecordDeclBits
+ ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
+
SmallVector<CXXBaseSpecifier *, 4> Bases;
for (const auto &Base1 : FromCXX->bases()) {
ExpectedType TyOrErr = import(Base1.getType());
diff --git a/clang/test/Import/cxx-record-flags/Inputs/F.cpp b/clang/test/Import/cxx-record-flags/Inputs/F.cpp
new file mode 100644
index 00000000000..1294c67f68d
--- /dev/null
+++ b/clang/test/Import/cxx-record-flags/Inputs/F.cpp
@@ -0,0 +1,9 @@
+class FTrivial {
+ int i;
+};
+
+struct FNonTrivial {
+ virtual ~FNonTrivial() = default;
+ int i;
+};
+
diff --git a/clang/test/Import/cxx-record-flags/test.cpp b/clang/test/Import/cxx-record-flags/test.cpp
new file mode 100644
index 00000000000..bff76274fba
--- /dev/null
+++ b/clang/test/Import/cxx-record-flags/test.cpp
@@ -0,0 +1,14 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: FTrivial
+// CHECK: DefinitionData
+// CHECK-SAME: pass_in_registers
+
+// CHECK: FNonTrivial
+// CHECK-NOT: pass_in_registers
+// CHECK: DefaultConstructor
+
+void expr() {
+ FTrivial f1;
+ FNonTrivial f2;
+}
OpenPOWER on IntegriCloud