From: Richard Smith Date: Fri, 30 Aug 2013 00:23:29 +0000 (+0000) Subject: Map from local decl IDs to global decl IDs when lazily deserializing friend decl... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=868edfa49df6f745751c82c514718fd30e2b2977;p=clang Map from local decl IDs to global decl IDs when lazily deserializing friend decl chains. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189629 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index a224aefa8f..67ca94bbf8 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/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/test/Modules/Inputs/cxx-decls-imported.h b/test/Modules/Inputs/cxx-decls-imported.h index e69de29bb2..b94368614d 100644 --- a/test/Modules/Inputs/cxx-decls-imported.h +++ b/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/test/Modules/Inputs/dummy.h b/test/Modules/Inputs/dummy.h new file mode 100644 index 0000000000..6e1ac74e44 --- /dev/null +++ b/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/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map index 7be8b797a1..ac3543b644 100644 --- a/test/Modules/Inputs/module.map +++ b/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/test/Modules/cxx-decls.cpp b/test/Modules/cxx-decls.cpp index 733e3f90bc..ba3281aaec 100644 --- a/test/Modules/cxx-decls.cpp +++ b/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); +}