r189629 - Map from local decl IDs to global decl IDs when lazily deserializing friend decl chains.
Richard Smith
richard-llvm at metafoo.co.uk
Thu Aug 29 17:23:29 PDT 2013
Author: rsmith
Date: Thu Aug 29 19:23:29 2013
New Revision: 189629
URL: http://llvm.org/viewvc/llvm-project?rev=189629&view=rev
Log:
Map from local decl IDs to global decl IDs when lazily deserializing friend decl chains.
Added:
cfe/trunk/test/Modules/Inputs/dummy.h
Modified:
cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
cfe/trunk/test/Modules/Inputs/cxx-decls-imported.h
cfe/trunk/test/Modules/Inputs/module.map
cfe/trunk/test/Modules/cxx-decls.cpp
Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=189629&r1=189628&r2=189629&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu Aug 29 19:23:29 2013
@@ -1186,8 +1186,8 @@ void ASTDeclReader::ReadCXXDefinitionDat
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(Frie
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);
}
Modified: cfe/trunk/test/Modules/Inputs/cxx-decls-imported.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/cxx-decls-imported.h?rev=189629&r1=189628&r2=189629&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/cxx-decls-imported.h (original)
+++ cfe/trunk/test/Modules/Inputs/cxx-decls-imported.h Thu Aug 29 19:23:29 2013
@@ -0,0 +1,5 @@
+class HasFriends {
+ friend void friend_1(HasFriends);
+ friend void friend_2(HasFriends);
+ void private_thing();
+};
Added: cfe/trunk/test/Modules/Inputs/dummy.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/dummy.h?rev=189629&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/dummy.h (added)
+++ cfe/trunk/test/Modules/Inputs/dummy.h Thu Aug 29 19:23:29 2013
@@ -0,0 +1,3 @@
+// This module only exists to make local decl IDs and global decl IDs different.
+
+struct Dummy {} extern *dummy1, *dummy2, *dummy3;
Modified: cfe/trunk/test/Modules/Inputs/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=189629&r1=189628&r2=189629&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/module.map (original)
+++ cfe/trunk/test/Modules/Inputs/module.map Thu Aug 29 19:23:29 2013
@@ -222,6 +222,10 @@ module diag_pragma {
header "diag_pragma.h"
}
+module dummy {
+ header "dummy.h"
+}
+
module builtin {
header "builtin.h"
explicit module sub {
Modified: cfe/trunk/test/Modules/cxx-decls.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/cxx-decls.cpp?rev=189629&r1=189628&r2=189629&view=diff
==============================================================================
--- cfe/trunk/test/Modules/cxx-decls.cpp (original)
+++ cfe/trunk/test/Modules/cxx-decls.cpp Thu Aug 29 19:23:29 2013
@@ -3,6 +3,7 @@
// expected-no-diagnostics
+ at 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);
+}
More information about the cfe-commits
mailing list