| 
					
				 | 
			
			
				@@ -245,6 +245,50 @@ void cmFortranParser_RuleModule(cmFortranParser* parser, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void cmFortranParser_RuleSubmodule(cmFortranParser* parser, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                   const char* module_name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                   const char* submodule_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (parser->InPPFalseBranch) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // syntax:   "submodule (module_name) submodule_name" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // requires: "module_name.mod" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // provides: "module_name@submodule_name.smod" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // FIXME: Some compilers split the submodule part of a module into a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // separate "module_name.smod" file.  Whether it is generated or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // not depends on conditions more subtle than we currently detect. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // For now we depend directly on "module_name.mod". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string const& mod_name = cmSystemTools::LowerCase(module_name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string const& sub_name = cmSystemTools::LowerCase(submodule_name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  parser->Info.Requires.insert(mod_name + ".mod"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  parser->Info.Provides.insert(mod_name + "@" + sub_name + ".smod"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void cmFortranParser_RuleSubmoduleNested(cmFortranParser* parser, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         const char* module_name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         const char* submodule_name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         const char* nested_submodule_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (parser->InPPFalseBranch) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // syntax:   "submodule (module_name:submodule_name) nested_submodule_name" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // requires: "module_name@submodule_name.smod" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // provides: "module_name@nested_submodule_name.smod" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string const& mod_name = cmSystemTools::LowerCase(module_name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string const& sub_name = cmSystemTools::LowerCase(submodule_name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string const& nest_name = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cmSystemTools::LowerCase(nested_submodule_name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  parser->Info.Requires.insert(mod_name + "@" + sub_name + ".smod"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  parser->Info.Provides.insert(mod_name + "@" + nest_name + ".smod"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void cmFortranParser_RuleDefine(cmFortranParser* parser, const char* macro) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!parser->InPPFalseBranch) { 
			 |