r196573 - Allow string literals as module names.

Daniel Jasper djasper at google.com
Fri Dec 6 01:25:54 PST 2013


Author: djasper
Date: Fri Dec  6 03:25:54 2013
New Revision: 196573

URL: http://llvm.org/viewvc/llvm-project?rev=196573&view=rev
Log:
Allow string literals as module names.

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.

Added:
    cfe/trunk/test/Modules/Inputs/string_names/
    cfe/trunk/test/Modules/Inputs/string_names/a.h
    cfe/trunk/test/Modules/Inputs/string_names/b.h
    cfe/trunk/test/Modules/Inputs/string_names/c.h
    cfe/trunk/test/Modules/Inputs/string_names/module.map
    cfe/trunk/test/Modules/Inputs/string_names/sub.h
    cfe/trunk/test/Modules/string_names.cpp
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
    cfe/trunk/lib/Lex/ModuleMap.cpp
    cfe/trunk/lib/Lex/PPDirectives.cpp
    cfe/trunk/test/Modules/Inputs/declare-use/h.h
    cfe/trunk/test/Modules/declare-use1.cpp
    cfe/trunk/test/Modules/declare-use2.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=196573&r1=196572&r2=196573&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Fri Dec  6 03:25:54 2013
@@ -614,7 +614,7 @@ def err_expected_id_building_module : Er
 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">,

Modified: cfe/trunk/lib/Lex/ModuleMap.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=196573&r1=196572&r2=196573&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/ModuleMap.cpp (original)
+++ cfe/trunk/lib/Lex/ModuleMap.cpp Fri Dec  6 03:25:54 2013
@@ -1066,7 +1066,7 @@ void ModuleMapParser::skipUntil(MMToken:
 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);
 }

Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=196573&r1=196572&r2=196573&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
+++ cfe/trunk/lib/Lex/PPDirectives.cpp Fri Dec  6 03:25:54 2013
@@ -610,7 +610,7 @@ void Preprocessor::verifyModuleInclude(S
   if (RequestingModule && getLangOpts().ModulesDeclUse &&
       violatesUseDeclarations(RequestingModule, RequestedModule.getModule()))
     Diag(FilenameLoc, diag::error_undeclared_use_of_module)
-        << Filename;
+        << RequestingModule->getFullModuleName() << Filename;
 }
 
 const FileEntry *Preprocessor::LookupFile(

Modified: cfe/trunk/test/Modules/Inputs/declare-use/h.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/declare-use/h.h?rev=196573&r1=196572&r2=196573&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/declare-use/h.h (original)
+++ cfe/trunk/test/Modules/Inputs/declare-use/h.h Fri Dec  6 03:25:54 2013
@@ -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

Added: cfe/trunk/test/Modules/Inputs/string_names/a.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/string_names/a.h?rev=196573&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/string_names/a.h (added)
+++ cfe/trunk/test/Modules/Inputs/string_names/a.h Fri Dec  6 03:25:54 2013
@@ -0,0 +1,4 @@
+#ifndef A_H
+#define A_H
+const int a = 2;
+#endif

Added: cfe/trunk/test/Modules/Inputs/string_names/b.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/string_names/b.h?rev=196573&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/string_names/b.h (added)
+++ cfe/trunk/test/Modules/Inputs/string_names/b.h Fri Dec  6 03:25:54 2013
@@ -0,0 +1,4 @@
+#ifndef B_H
+#define B_H
+const int b = 3;
+#endif

Added: cfe/trunk/test/Modules/Inputs/string_names/c.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/string_names/c.h?rev=196573&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/string_names/c.h (added)
+++ cfe/trunk/test/Modules/Inputs/string_names/c.h Fri Dec  6 03:25:54 2013
@@ -0,0 +1,4 @@
+#ifndef C_H
+#define C_H
+const int c = 2;
+#endif

Added: cfe/trunk/test/Modules/Inputs/string_names/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/string_names/module.map?rev=196573&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/string_names/module.map (added)
+++ cfe/trunk/test/Modules/Inputs/string_names/module.map Fri Dec  6 03:25:54 2013
@@ -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"
+}

Added: cfe/trunk/test/Modules/Inputs/string_names/sub.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/string_names/sub.h?rev=196573&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/string_names/sub.h (added)
+++ cfe/trunk/test/Modules/Inputs/string_names/sub.h Fri Dec  6 03:25:54 2013
@@ -0,0 +1,4 @@
+#ifndef SUB_H
+#define SUB_H
+const int sub = 2;
+#endif

Modified: cfe/trunk/test/Modules/declare-use1.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/declare-use1.cpp?rev=196573&r1=196572&r2=196573&view=diff
==============================================================================
--- cfe/trunk/test/Modules/declare-use1.cpp (original)
+++ cfe/trunk/test/Modules/declare-use1.cpp Fri Dec  6 03:25:54 2013
@@ -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;

Modified: cfe/trunk/test/Modules/declare-use2.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/declare-use2.cpp?rev=196573&r1=196572&r2=196573&view=diff
==============================================================================
--- cfe/trunk/test/Modules/declare-use2.cpp (original)
+++ cfe/trunk/test/Modules/declare-use2.cpp Fri Dec  6 03:25:54 2013
@@ -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;

Added: cfe/trunk/test/Modules/string_names.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/string_names.cpp?rev=196573&view=auto
==============================================================================
--- cfe/trunk/test/Modules/string_names.cpp (added)
+++ cfe/trunk/test/Modules/string_names.cpp Fri Dec  6 03:25:54 2013
@@ -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"





More information about the cfe-commits mailing list