forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			89 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
// RUN: rm -rf %t
 | 
						|
// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify -DERRORS
 | 
						|
// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify
 | 
						|
// 
 | 
						|
// Test both with and without the declarations that refer to unimported
 | 
						|
// entities. For error recovery, those cases implicitly trigger an import.
 | 
						|
 | 
						|
#include <DependsOnModule/DependsOnModule.h> // expected-warning{{treating #include as an import of module 'DependsOnModule'}}
 | 
						|
 | 
						|
#ifdef MODULE_H_MACRO
 | 
						|
#  error MODULE_H_MACRO should have been hidden
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef DEPENDS_ON_MODULE
 | 
						|
#  error DEPENDS_ON_MODULE should have been hidden
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef ERRORS
 | 
						|
Module *mod; // expected-error{{declaration of 'Module' must be imported from module 'Module' before it is required}}
 | 
						|
// expected-note@Inputs/Module.framework/Headers/Module.h:15 {{previous}}
 | 
						|
#else
 | 
						|
#import <AlsoDependsOnModule/AlsoDependsOnModule.h> // expected-warning{{treating #import as an import of module 'AlsoDependsOnModule'}}
 | 
						|
#endif
 | 
						|
Module *mod2;
 | 
						|
 | 
						|
int getDependsOther() { return depends_on_module_other; }
 | 
						|
 | 
						|
void testSubframeworkOther() {
 | 
						|
#ifdef ERRORS
 | 
						|
  double *sfo1 = sub_framework_other; // expected-error{{declaration of 'sub_framework_other' must be imported from module 'DependsOnModule.SubFramework.Other'}}
 | 
						|
  // expected-note@Inputs/DependsOnModule.framework/Frameworks/SubFramework.framework/Headers/Other.h:15 {{previous}}
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
// Test umbrella-less submodule includes
 | 
						|
#include <NoUmbrella/A.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.A'}}
 | 
						|
int getNoUmbrellaA() { return no_umbrella_A; } 
 | 
						|
 | 
						|
// Test umbrella-less submodule includes
 | 
						|
#include <NoUmbrella/SubDir/C.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.SubDir.C'}}
 | 
						|
int getNoUmbrellaC() { return no_umbrella_C; } 
 | 
						|
 | 
						|
#ifndef ERRORS
 | 
						|
// Test header cross-subframework include pattern.
 | 
						|
#include <DependsOnModule/../Frameworks/SubFramework.framework/Headers/Other.h> // expected-warning{{treating #include as an import of module 'DependsOnModule.SubFramework.Other'}}
 | 
						|
#endif
 | 
						|
 | 
						|
void testSubframeworkOtherAgain() {
 | 
						|
  double *sfo1 = sub_framework_other;
 | 
						|
}
 | 
						|
 | 
						|
void testModuleSubFramework() {
 | 
						|
  char *msf = module_subframework;
 | 
						|
}
 | 
						|
 | 
						|
#include <Module/../Frameworks/SubFramework.framework/Headers/SubFramework.h> // expected-warning{{treating #include as an import of module 'Module.SubFramework'}}
 | 
						|
 | 
						|
void testModuleSubFrameworkAgain() {
 | 
						|
  char *msf = module_subframework;
 | 
						|
}
 | 
						|
 | 
						|
// Test inclusion of private headers.
 | 
						|
#include <DependsOnModule/DependsOnModulePrivate.h> // expected-warning{{treating #include as an import of module 'DependsOnModule.Private.DependsOnModule'}}
 | 
						|
 | 
						|
int getDependsOnModulePrivate() { return depends_on_module_private; }
 | 
						|
 | 
						|
#include <Module/ModulePrivate.h> // includes the header
 | 
						|
 | 
						|
int getModulePrivate() { return module_private; }
 | 
						|
 | 
						|
#include <NoUmbrella/A_Private.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.Private.A_Private'}}
 | 
						|
int getNoUmbrellaAPrivate() { return no_umbrella_A_private; }
 | 
						|
 | 
						|
int getNoUmbrellaBPrivateFail() { return no_umbrella_B_private; } // expected-error{{declaration of 'no_umbrella_B_private' must be imported from module 'NoUmbrella.Private.B_Private'}}
 | 
						|
// expected-note@Inputs/NoUmbrella.framework/PrivateHeaders/B_Private.h:1 {{previous}}
 | 
						|
 | 
						|
// Test inclusion of headers that are under an umbrella directory but
 | 
						|
// not actually part of the module.
 | 
						|
#include <Module/NotInModule.h> // expected-warning{{treating #include as an import of module 'Module.NotInModule'}} \
 | 
						|
  // expected-warning{{missing submodule 'Module.NotInModule'}}
 | 
						|
 | 
						|
int getNotInModule() {
 | 
						|
  return not_in_module;
 | 
						|
}
 | 
						|
 | 
						|
void includeNotAtTopLevel() { // expected-note {{to match this '{'}}
 | 
						|
  #include <NoUmbrella/A.h> // expected-warning {{treating #include as an import}} expected-error {{expected '}'}}
 | 
						|
} // expected-error {{extraneous closing brace}}
 |