Before this commit, attempting to use non-ASCII characters in quoted
words failed, even though the protocol allows the usage of such
characters in quoted words. To fix this:
1. Remove `c >= 0x7f` comparison when parsing a quoted word.
2. Use `unsigned char` instead of `char` such that `c < 0x20` fails for
non-ASCII characters.
PR 120458
libcody/ChangeLog:
* buffer.cc (S2C):
(MessageBuffer::Lex):
* cody.hh:
gcc/testsuite/ChangeLog:
* g++.dg/README:
* g++.dg/modules/pr120458_a.C: New test.
* g++.dg/modules/pr120458_b.C: New test.
Signed-off-by: Jean-Christian CÎRSTEA <[email protected]>
---
gcc/testsuite/g++.dg/README | 1 +
gcc/testsuite/g++.dg/modules/pr120458_a.C | 9 +++++++++
gcc/testsuite/g++.dg/modules/pr120458_b.C | 11 +++++++++++
libcody/buffer.cc | 6 +++---
libcody/cody.hh | 4 ++--
5 files changed, 26 insertions(+), 5 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/modules/pr120458_a.C
create mode 100644 gcc/testsuite/g++.dg/modules/pr120458_b.C
diff --git a/gcc/testsuite/g++.dg/README b/gcc/testsuite/g++.dg/README
index a7b3d5b783b..3301f17b4df 100644
--- a/gcc/testsuite/g++.dg/README
+++ b/gcc/testsuite/g++.dg/README
@@ -15,6 +15,7 @@ inherit Tests for inheritance -- virtual functions,
multiple inheritance, etc.
init Tests for initialization semantics, constructors/destructors, etc.
lookup Tests for lookup semantics, namespaces, using, etc.
lto Tests for Link Time Optimization.
+modules Tests for C++20 modules.
opt Tests for fixes of bugs with particular optimizations.
overload Tests for overload resolution and conversions.
parse Tests for parsing.
diff --git a/gcc/testsuite/g++.dg/modules/pr120458_a.C
b/gcc/testsuite/g++.dg/modules/pr120458_a.C
new file mode 100644
index 00000000000..0774102b0c9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr120458_a.C
@@ -0,0 +1,9 @@
+// check internals by name unless SCC
+// { dg-additional-options "-fmodules-ts -fdump-lang-module-uid" }
+
+export module étrange;
+// { dg-module-cmi étrange }
+
+export unsigned f(unsigned x) {
+ return x + 3;
+}
diff --git a/gcc/testsuite/g++.dg/modules/pr120458_b.C
b/gcc/testsuite/g++.dg/modules/pr120458_b.C
new file mode 100644
index 00000000000..49835b94323
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr120458_b.C
@@ -0,0 +1,11 @@
+// check internals by name unless SCC
+// { dg-additional-options "-fmodules-ts -fdump-lang-module-uid" }
+
+export module bar;
+// { dg-module-cmi bar }
+
+import étrange;
+
+export unsigned g(unsigned x) {
+ return f(x) * 7;
+}
diff --git a/libcody/buffer.cc b/libcody/buffer.cc
index 85c066fef71..d27882b7d4a 100644
--- a/libcody/buffer.cc
+++ b/libcody/buffer.cc
@@ -30,7 +30,7 @@
namespace Cody {
namespace Detail {
-static const char CONTINUE = S2C(u8";");
+static const unsigned char CONTINUE = S2C(u8";");
void MessageBuffer::BeginLine ()
{
@@ -239,7 +239,7 @@ int MessageBuffer::Lex (std::vector<std::string> &result)
for (std::string *word = nullptr;;)
{
- char c = *iter;
+ unsigned char c = *iter;
++iter;
if (c == S2C(u8" ") || c == S2C(u8"\t"))
@@ -292,7 +292,7 @@ int MessageBuffer::Lex (std::vector<std::string> &result)
return EINVAL;
}
- if (c < S2C(u8" ") || c >= 0x7f)
+ if (c < S2C(u8" "))
goto malformed;
++iter;
diff --git a/libcody/cody.hh b/libcody/cody.hh
index 93bce93aa94..7c852eb3aa1 100644
--- a/libcody/cody.hh
+++ b/libcody/cody.hh
@@ -49,14 +49,14 @@ namespace Detail {
#if __cpp_char8_t >= 201811
template<unsigned I>
-constexpr char S2C (char8_t const (&s)[I])
+constexpr unsigned char S2C (char8_t const (&s)[I])
{
static_assert (I == 2, "only single octet strings may be converted");
return s[0];
}
#else
template<unsigned I>
-constexpr char S2C (char const (&s)[I])
+constexpr unsigned char S2C (char const (&s)[I])
{
static_assert (I == 2, "only single octet strings may be converted");
return s[0];
--
2.53.0