diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-09-01 14:34:29 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-09-02 10:42:43 +0000 |
commit | c504e56d0c7fafba4f8c15997e3927b5ca02adc5 (patch) | |
tree | dfbd550a0c62eafe554df8b8dfb89c039e330400 | |
parent | b1ee76047a77b4d23295c3231df3b53b6f5e6a4b (diff) | |
download | qt-creator-c504e56d0c7fafba4f8c15997e3927b5ca02adc5.tar.gz |
C++: Fix MSVC assert in std::isspace()
...when dealing with UTF8 bytes.
std::isspace() expects unsigned char, not char.
Change-Id: I3f9b5e347d79cf94015cc99f8797d5feab406151
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
-rw-r--r-- | src/libs/cplusplus/pp-engine.cpp | 2 | ||||
-rw-r--r-- | tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp | 21 |
2 files changed, 22 insertions, 1 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index fa96c54176..93a6e451b4 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -2129,7 +2129,7 @@ void Preprocessor::maybeStartOutputLine() // If previous line ends with \ (possibly followed by whitespace), add another \n const char *start = buffer.constData(); const char *ch = start + buffer.length() - 2; - while (ch > start && (*ch != '\n') && std::isspace(*ch)) + while (ch > start && (*ch != '\n') && pp_isspace(*ch)) --ch; if (*ch == '\\') buffer.append('\n'); diff --git a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp index 376716a9e7..47eb297ded 100644 --- a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp +++ b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp @@ -409,6 +409,7 @@ private slots: void undef(); void concat(); void excessive_nesting(); + void multi_byte_code_point_in_expansion(); }; // Remove all #... lines, and 'simplify' string, to allow easily comparing the result @@ -2064,6 +2065,26 @@ void tst_Preprocessor::excessive_nesting() QCOMPARE(prep, output); } +void tst_Preprocessor::multi_byte_code_point_in_expansion() +{ + Environment env; + Preprocessor preprocess(0, &env); + const QByteArray input = + "#define FOO(x) x\n" + "FOO(arg" UC_U00FC "\n)\n"; + + const QByteArray actual = preprocess.run(QLatin1String("<stdin>"), input); + + const QByteArray expected = + "# 1 \"<stdin>\"\n" + "\n" + "# expansion begin 17,3 2:4\n" + "arg" UC_U00FC "\n" + "# expansion end\n" + "# 4 \"<stdin>\"\n"; + QCOMPARE(actual, expected); +} + void tst_Preprocessor::compare_input_output(bool keepComments) { QFETCH(QByteArray, input); |