]> granicus.if.org Git - clang/commitdiff
Allow string literals as module names.
authorDaniel Jasper <djasper@google.com>
Fri, 6 Dec 2013 09:25:54 +0000 (09:25 +0000)
committerDaniel Jasper <djasper@google.com>
Fri, 6 Dec 2013 09:25:54 +0000 (09:25 +0000)
In order to make the migration to modules easier, it seems to be helpful
to allow a 1:1 mapping between target names of a current build system
and the corresponding C++ modules. As  such targets commonly contain
characters like "-". ":" and "/", allowing arbitrary quote-escaped
strings seems to be a straightforward option.

After several offline discussions, the precise mechanisms for C++
module names especially regarding submodules and import statements has
yet to be determined. Thus, this patch only enables string literals as
names inside the module map files which can be used by automatic module
import (through #include).

Also improve the error message on missing use-declarations.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196573 91177308-0d34-0410-b5e6-96231b3b80d8

12 files changed:
include/clang/Basic/DiagnosticLexKinds.td
lib/Lex/ModuleMap.cpp
lib/Lex/PPDirectives.cpp
test/Modules/Inputs/declare-use/h.h
test/Modules/Inputs/string_names/a.h [new file with mode: 0644]
test/Modules/Inputs/string_names/b.h [new file with mode: 0644]
test/Modules/Inputs/string_names/c.h [new file with mode: 0644]
test/Modules/Inputs/string_names/module.map [new file with mode: 0644]
test/Modules/Inputs/string_names/sub.h [new file with mode: 0644]
test/Modules/declare-use1.cpp
test/Modules/declare-use2.cpp
test/Modules/string_names.cpp [new file with mode: 0644]

index 871f5f65447d65157a93a0ecb6612d84be5a87d3..e9de4db036805452d2eca7a368e6090cca3db157 100644 (file)
@@ -614,7 +614,7 @@ def err_expected_id_building_module : Error<
 def error_use_of_private_header_outside_module : Error<
   "use of private header from outside its module: '%0'">;
 def error_undeclared_use_of_module : Error<
-  "use of a module not declared used: '%0'">;
+  "module %0 does not depend on a module exporting '%1'">;
 
 def warn_header_guard : Warning<
   "%0 is used as a header guard here, followed by #define of a different macro">,
index f4dfa12854a353caf15c1feff952328ad2ff4fb3..3ce0def1d1c0031ae037182b819995ad87585a74 100644 (file)
@@ -1066,7 +1066,7 @@ void ModuleMapParser::skipUntil(MMToken::TokenKind K) {
 bool ModuleMapParser::parseModuleId(ModuleId &Id) {
   Id.clear();
   do {
-    if (Tok.is(MMToken::Identifier)) {
+    if (Tok.is(MMToken::Identifier) || Tok.is(MMToken::StringLiteral)) {
       Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation()));
       consumeToken();
     } else {
@@ -1687,25 +1687,7 @@ void ModuleMapParser::parseUseDecl() {
   consumeToken();
   // Parse the module-id.
   ModuleId ParsedModuleId;
-
-  do {
-    if (Tok.is(MMToken::Identifier)) {
-      ParsedModuleId.push_back(
-          std::make_pair(Tok.getString(), Tok.getLocation()));
-      consumeToken();
-
-      if (Tok.is(MMToken::Period)) {
-        consumeToken();
-        continue;
-      }
-
-      break;
-    }
-
-    Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
-    HadError = true;
-    return;
-  } while (true);
+  parseModuleId(ParsedModuleId);
 
   ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId);
 }
index 7d4c788f660fb31df021875955aebb28b897e19e..70c32c3dc69a33e623b1936f7b498fd74aa562e1 100644 (file)
@@ -610,7 +610,7 @@ void Preprocessor::verifyModuleInclude(SourceLocation FilenameLoc,
   if (RequestingModule && getLangOpts().ModulesDeclUse &&
       violatesUseDeclarations(RequestingModule, RequestedModule.getModule()))
     Diag(FilenameLoc, diag::error_undeclared_use_of_module)
-        << Filename;
+        << RequestingModule->getFullModuleName() << Filename;
 }
 
 const FileEntry *Preprocessor::LookupFile(
index df99a6dd10ae999c78c3ded6ff6fb9178bfadf7a..379e50180ca19964edb164de8d4c7ca3257ab543 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef H_H
 #define H_H
 #include "c.h"
-#include "d.h" // expected-error {{use of a module not declared used}}
+#include "d.h" // expected-error {{does not depend on a module exporting}}
 #include "h1.h"
 const int h1 = aux_h*c*7*d;
 #endif
diff --git a/test/Modules/Inputs/string_names/a.h b/test/Modules/Inputs/string_names/a.h
new file mode 100644 (file)
index 0000000..a36dc1b
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef A_H
+#define A_H
+const int a = 2;
+#endif
diff --git a/test/Modules/Inputs/string_names/b.h b/test/Modules/Inputs/string_names/b.h
new file mode 100644 (file)
index 0000000..55daf72
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef B_H
+#define B_H
+const int b = 3;
+#endif
diff --git a/test/Modules/Inputs/string_names/c.h b/test/Modules/Inputs/string_names/c.h
new file mode 100644 (file)
index 0000000..38c278f
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef C_H
+#define C_H
+const int c = 2;
+#endif
diff --git a/test/Modules/Inputs/string_names/module.map b/test/Modules/Inputs/string_names/module.map
new file mode 100644 (file)
index 0000000..4e70eda
--- /dev/null
@@ -0,0 +1,16 @@
+module "my/module-a" {
+  header "a.h"
+  use "my/module-c"
+
+  module "Sub" {
+    header "sub.h"
+  }
+}
+
+module "my/module-b" {
+  header "b.h"
+}
+
+module "my/module-c" {
+  header "c.h"
+}
diff --git a/test/Modules/Inputs/string_names/sub.h b/test/Modules/Inputs/string_names/sub.h
new file mode 100644 (file)
index 0000000..64b9112
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef SUB_H
+#define SUB_H
+const int sub = 2;
+#endif
index 4508017c12d205e7d2828c86f5bba4ce5eed2b6b..5b344032d29db57d62dde8263e5100072d6017b8 100644 (file)
@@ -3,5 +3,5 @@
 
 #include "g.h"
 #include "e.h"
-#include "f.h" // expected-error {{use of a module not declared used}}
+#include "f.h" // expected-error {{module XG does not depend on a module exporting 'f.h'}}
 const int g2 = g1+e+f;
index a2ec55e5e5ca3b4fb1c43a1641087d0a3838116b..15c57ca36d8af6038776bef222d33af7a5ef95bb 100644 (file)
@@ -3,5 +3,5 @@
 
 #include "h.h"
 #include "e.h"
-#include "f.h" // expected-error {{use of a module not declared used}}
+#include "f.h" // expected-error {{does not depend on a module exporting}}
 const int h2 = h1+e+f;
diff --git a/test/Modules/string_names.cpp b/test/Modules/string_names.cpp
new file mode 100644 (file)
index 0000000..ed65aa8
--- /dev/null
@@ -0,0 +1,6 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fmodules-decluse -I %S/Inputs/string_names %s -fmodule-name="my/module-a" -verify
+
+#include "a.h"
+#include "b.h" // expected-error {{does not depend on a module exporting}}
+#include "c.h"