summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2013-12-06 09:25:54 +0000
committerDaniel Jasper <djasper@google.com>2013-12-06 09:25:54 +0000
commit3cd34c7637e8bee4fabd1675f15b4e001f7294b9 (patch)
treee1b6c3ff16ef92a12fdb472ff218f5b1e13077ba
parent67bbf967b03fdcbaa98dce5ca6cd3deced930894 (diff)
downloadbcm5719-llvm-3cd34c7637e8bee4fabd1675f15b4e001f7294b9.tar.gz
bcm5719-llvm-3cd34c7637e8bee4fabd1675f15b4e001f7294b9.zip
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. llvm-svn: 196573
-rw-r--r--clang/include/clang/Basic/DiagnosticLexKinds.td2
-rw-r--r--clang/lib/Lex/ModuleMap.cpp22
-rw-r--r--clang/lib/Lex/PPDirectives.cpp2
-rw-r--r--clang/test/Modules/Inputs/declare-use/h.h2
-rw-r--r--clang/test/Modules/Inputs/string_names/a.h4
-rw-r--r--clang/test/Modules/Inputs/string_names/b.h4
-rw-r--r--clang/test/Modules/Inputs/string_names/c.h4
-rw-r--r--clang/test/Modules/Inputs/string_names/module.map16
-rw-r--r--clang/test/Modules/Inputs/string_names/sub.h4
-rw-r--r--clang/test/Modules/declare-use1.cpp2
-rw-r--r--clang/test/Modules/declare-use2.cpp2
-rw-r--r--clang/test/Modules/string_names.cpp6
12 files changed, 45 insertions, 25 deletions
diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td
index 871f5f65447..e9de4db0368 100644
--- a/clang/include/clang/Basic/DiagnosticLexKinds.td
+++ b/clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -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">,
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp
index f4dfa12854a..3ce0def1d1c 100644
--- a/clang/lib/Lex/ModuleMap.cpp
+++ b/clang/lib/Lex/ModuleMap.cpp
@@ -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);
}
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index 7d4c788f660..70c32c3dc69 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -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(
diff --git a/clang/test/Modules/Inputs/declare-use/h.h b/clang/test/Modules/Inputs/declare-use/h.h
index df99a6dd10a..379e50180ca 100644
--- a/clang/test/Modules/Inputs/declare-use/h.h
+++ b/clang/test/Modules/Inputs/declare-use/h.h
@@ -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/clang/test/Modules/Inputs/string_names/a.h b/clang/test/Modules/Inputs/string_names/a.h
new file mode 100644
index 00000000000..a36dc1b59d6
--- /dev/null
+++ b/clang/test/Modules/Inputs/string_names/a.h
@@ -0,0 +1,4 @@
+#ifndef A_H
+#define A_H
+const int a = 2;
+#endif
diff --git a/clang/test/Modules/Inputs/string_names/b.h b/clang/test/Modules/Inputs/string_names/b.h
new file mode 100644
index 00000000000..55daf728680
--- /dev/null
+++ b/clang/test/Modules/Inputs/string_names/b.h
@@ -0,0 +1,4 @@
+#ifndef B_H
+#define B_H
+const int b = 3;
+#endif
diff --git a/clang/test/Modules/Inputs/string_names/c.h b/clang/test/Modules/Inputs/string_names/c.h
new file mode 100644
index 00000000000..38c278fc87d
--- /dev/null
+++ b/clang/test/Modules/Inputs/string_names/c.h
@@ -0,0 +1,4 @@
+#ifndef C_H
+#define C_H
+const int c = 2;
+#endif
diff --git a/clang/test/Modules/Inputs/string_names/module.map b/clang/test/Modules/Inputs/string_names/module.map
new file mode 100644
index 00000000000..4e70eda3992
--- /dev/null
+++ b/clang/test/Modules/Inputs/string_names/module.map
@@ -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/clang/test/Modules/Inputs/string_names/sub.h b/clang/test/Modules/Inputs/string_names/sub.h
new file mode 100644
index 00000000000..64b9112d3e6
--- /dev/null
+++ b/clang/test/Modules/Inputs/string_names/sub.h
@@ -0,0 +1,4 @@
+#ifndef SUB_H
+#define SUB_H
+const int sub = 2;
+#endif
diff --git a/clang/test/Modules/declare-use1.cpp b/clang/test/Modules/declare-use1.cpp
index 4508017c12d..5b344032d29 100644
--- a/clang/test/Modules/declare-use1.cpp
+++ b/clang/test/Modules/declare-use1.cpp
@@ -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;
diff --git a/clang/test/Modules/declare-use2.cpp b/clang/test/Modules/declare-use2.cpp
index a2ec55e5e5c..15c57ca36d8 100644
--- a/clang/test/Modules/declare-use2.cpp
+++ b/clang/test/Modules/declare-use2.cpp
@@ -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/clang/test/Modules/string_names.cpp b/clang/test/Modules/string_names.cpp
new file mode 100644
index 00000000000..ed65aa8a670
--- /dev/null
+++ b/clang/test/Modules/string_names.cpp
@@ -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"
OpenPOWER on IntegriCloud