summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-09-01 14:34:29 +0200
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-09-02 10:42:43 +0000
commitc504e56d0c7fafba4f8c15997e3927b5ca02adc5 (patch)
treedfbd550a0c62eafe554df8b8dfb89c039e330400
parentb1ee76047a77b4d23295c3231df3b53b6f5e6a4b (diff)
downloadqt-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.cpp2
-rw-r--r--tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp21
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);