summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-08-30 00:23:29 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-08-30 00:23:29 +0000
commit9dd9f036c6998389b6c5c1c326199572be5fd6cb (patch)
treee3cf333e5a44dab19d2c0afbd2c0f39f05a9c4c4
parenta23f4fb5c90624ce66e276512ca4577a72a9527f (diff)
downloadbcm5719-llvm-9dd9f036c6998389b6c5c1c326199572be5fd6cb.tar.gz
bcm5719-llvm-9dd9f036c6998389b6c5c1c326199572be5fd6cb.zip
Map from local decl IDs to global decl IDs when lazily deserializing friend decl chains.
llvm-svn: 189629
-rw-r--r--clang/lib/Serialization/ASTReaderDecl.cpp6
-rw-r--r--clang/test/Modules/Inputs/cxx-decls-imported.h5
-rw-r--r--clang/test/Modules/Inputs/dummy.h3
-rw-r--r--clang/test/Modules/Inputs/module.map4
-rw-r--r--clang/test/Modules/cxx-decls.cpp9
5 files changed, 24 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index a224aefa8fa..67ca94bbf8e 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1186,8 +1186,8 @@ void ASTDeclReader::ReadCXXDefinitionData(
Reader.ReadUnresolvedSet(F, Data.Conversions, Record, Idx);
Reader.ReadUnresolvedSet(F, Data.VisibleConversions, Record, Idx);
assert(Data.Definition && "Data.Definition should be already set!");
- Data.FirstFriend = Record[Idx++];
-
+ Data.FirstFriend = ReadDeclID(Record, Idx);
+
if (Data.IsLambda) {
typedef LambdaExpr::Capture Capture;
CXXRecordDecl::LambdaDefinitionData &Lambda
@@ -1339,7 +1339,7 @@ void ASTDeclReader::VisitFriendDecl(FriendDecl *D) {
D->Friend = GetTypeSourceInfo(Record, Idx);
for (unsigned i = 0; i != D->NumTPLists; ++i)
D->getTPLists()[i] = Reader.ReadTemplateParameterList(F, Record, Idx);
- D->NextFriend = Record[Idx++];
+ D->NextFriend = ReadDeclID(Record, Idx);
D->UnsupportedFriend = (Record[Idx++] != 0);
D->FriendLoc = ReadSourceLocation(Record, Idx);
}
diff --git a/clang/test/Modules/Inputs/cxx-decls-imported.h b/clang/test/Modules/Inputs/cxx-decls-imported.h
index e69de29bb2d..b94368614df 100644
--- a/clang/test/Modules/Inputs/cxx-decls-imported.h
+++ b/clang/test/Modules/Inputs/cxx-decls-imported.h
@@ -0,0 +1,5 @@
+class HasFriends {
+ friend void friend_1(HasFriends);
+ friend void friend_2(HasFriends);
+ void private_thing();
+};
diff --git a/clang/test/Modules/Inputs/dummy.h b/clang/test/Modules/Inputs/dummy.h
new file mode 100644
index 00000000000..6e1ac74e44f
--- /dev/null
+++ b/clang/test/Modules/Inputs/dummy.h
@@ -0,0 +1,3 @@
+// This module only exists to make local decl IDs and global decl IDs different.
+
+struct Dummy {} extern *dummy1, *dummy2, *dummy3;
diff --git a/clang/test/Modules/Inputs/module.map b/clang/test/Modules/Inputs/module.map
index 7be8b797a1a..ac3543b6440 100644
--- a/clang/test/Modules/Inputs/module.map
+++ b/clang/test/Modules/Inputs/module.map
@@ -222,6 +222,10 @@ module diag_pragma {
header "diag_pragma.h"
}
+module dummy {
+ header "dummy.h"
+}
+
module builtin {
header "builtin.h"
explicit module sub {
diff --git a/clang/test/Modules/cxx-decls.cpp b/clang/test/Modules/cxx-decls.cpp
index 733e3f90bc7..ba3281aaec7 100644
--- a/clang/test/Modules/cxx-decls.cpp
+++ b/clang/test/Modules/cxx-decls.cpp
@@ -3,6 +3,7 @@
// expected-no-diagnostics
+@import dummy;
@import cxx_decls.imported;
void test_delete(int *p) {
@@ -10,3 +11,11 @@ void test_delete(int *p) {
// ever been explicitly declared in an unimported submodule.
delete p;
}
+
+void friend_1(HasFriends s) {
+ s.private_thing();
+}
+void test_friends(HasFriends s) {
+ friend_1(s);
+ friend_2(s);
+}
OpenPOWER on IntegriCloud