Author: benlangmuir
Date: Mon Jan 12 13:27:00 2015
New Revision: 225659

URL: http://llvm.org/viewvc/llvm-project?rev=225659&view=rev
Log:
Fix bogus 'method is unavailable' errors with modules

This just tweaks the fix from r224892 (which handled PCHs) to work with
modules, where we will serialize each method individually and hence the
hasMoreThanOneDecl bit needs to be updated as we add the methods.

Added:
    cfe/trunk/test/Modules/Inputs/attr-unavailable/
    cfe/trunk/test/Modules/Inputs/attr-unavailable/module.modulemap
    cfe/trunk/test/Modules/Inputs/attr-unavailable/oneA.h
    cfe/trunk/test/Modules/Inputs/attr-unavailable/oneB.h
    cfe/trunk/test/Modules/Inputs/attr-unavailable/oneC.h
    cfe/trunk/test/Modules/Inputs/attr-unavailable/two.h
    cfe/trunk/test/Modules/attr-unavailable.m
Modified:
    cfe/trunk/lib/Serialization/ASTReader.cpp

Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=225659&r1=225658&r2=225659&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Mon Jan 12 13:27:00 2015
@@ -7161,13 +7161,17 @@ void ASTReader::ReadMethodPool(Selector
   Sema &S = *getSema();
   Sema::GlobalMethodPool::iterator Pos
     = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
-  
-  addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
-  addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
+
   Pos->second.first.setBits(Visitor.getInstanceBits());
   
Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
   Pos->second.second.setBits(Visitor.getFactoryBits());
   
Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
+
+  // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
+  // when building a module we keep every method individually and may need to
+  // update hasMoreThanOneDecl as we add the methods.
+  addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
+  addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
 }
 
 void ASTReader::ReadKnownNamespaces(

Added: cfe/trunk/test/Modules/Inputs/attr-unavailable/module.modulemap
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/attr-unavailable/module.modulemap?rev=225659&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/attr-unavailable/module.modulemap (added)
+++ cfe/trunk/test/Modules/Inputs/attr-unavailable/module.modulemap Mon Jan 12 
13:27:00 2015
@@ -0,0 +1,4 @@
+module two { header "two.h" }
+module oneA { header "oneA.h" }
+module oneB { header "oneB.h" export oneA }
+module oneC { header "oneC.h" }

Added: cfe/trunk/test/Modules/Inputs/attr-unavailable/oneA.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/attr-unavailable/oneA.h?rev=225659&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/attr-unavailable/oneA.h (added)
+++ cfe/trunk/test/Modules/Inputs/attr-unavailable/oneA.h Mon Jan 12 13:27:00 
2015
@@ -0,0 +1,4 @@
+@interface C
+-(void)method2 __attribute__((unavailable));
+-(void)method3 __attribute__((unavailable));
+@end

Added: cfe/trunk/test/Modules/Inputs/attr-unavailable/oneB.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/attr-unavailable/oneB.h?rev=225659&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/attr-unavailable/oneB.h (added)
+++ cfe/trunk/test/Modules/Inputs/attr-unavailable/oneB.h Mon Jan 12 13:27:00 
2015
@@ -0,0 +1,5 @@
+@import oneA;
+
+@interface D
+-(void)method2;
+@end

Added: cfe/trunk/test/Modules/Inputs/attr-unavailable/oneC.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/attr-unavailable/oneC.h?rev=225659&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/attr-unavailable/oneC.h (added)
+++ cfe/trunk/test/Modules/Inputs/attr-unavailable/oneC.h Mon Jan 12 13:27:00 
2015
@@ -0,0 +1,3 @@
+@interface E
+-(void)method3;
+@end

Added: cfe/trunk/test/Modules/Inputs/attr-unavailable/two.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/attr-unavailable/two.h?rev=225659&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/attr-unavailable/two.h (added)
+++ cfe/trunk/test/Modules/Inputs/attr-unavailable/two.h Mon Jan 12 13:27:00 
2015
@@ -0,0 +1,6 @@
+@interface A
+-(void)method1;
+@end
+@interface B
+-(void)method1 __attribute__((unavailable));
+@end

Added: cfe/trunk/test/Modules/attr-unavailable.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/attr-unavailable.m?rev=225659&view=auto
==============================================================================
--- cfe/trunk/test/Modules/attr-unavailable.m (added)
+++ cfe/trunk/test/Modules/attr-unavailable.m Mon Jan 12 13:27:00 2015
@@ -0,0 +1,25 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I 
%S/Inputs/attr-unavailable %s -fsyntax-only -verify
+
+@import two;
+void f(id x) {
+  [x method1];
+}
+
+@import oneA;
+void g(id x) {
+  [x method2]; // expected-error{{'method2' is unavailable}}
+               // [email protected]:2 {{'method2' has been explicitly 
marked unavailable here}}
+  [x method3]; // expected-error{{'method3' is unavailable}}
+               // [email protected]:3 {{'method3' has been explicitly 
marked unavailable here}}
+}
+
+@import oneB;
+void h(id x) {
+  [x method2]; // could be from interface D in module oneB
+}
+
+@import oneC;
+void i(id x) {
+  [x method3]; // could be from interface E in module oncC
+}


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to