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