summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex/Pragma.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2013-05-04 10:37:20 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2013-05-04 10:37:20 +0000
commitc2f5f29b8d94d4ab761260b922793987ff721aa4 (patch)
tree8fe86f4e5a29cd3ef63c89fb5959c4e46e3b8518 /clang/lib/Lex/Pragma.cpp
parentacb8ecd6642708a11d3a53888fd8f7a903445b40 (diff)
downloadbcm5719-llvm-c2f5f29b8d94d4ab761260b922793987ff721aa4.tar.gz
bcm5719-llvm-c2f5f29b8d94d4ab761260b922793987ff721aa4.zip
Lex: Fix quadratic behavior when unescaping _Pragma strings.
No functionality change. llvm-svn: 181114
Diffstat (limited to 'clang/lib/Lex/Pragma.cpp')
-rw-r--r--clang/lib/Lex/Pragma.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp
index b5a76fd3cb2..d674ad34b47 100644
--- a/clang/lib/Lex/Pragma.cpp
+++ b/clang/lib/Lex/Pragma.cpp
@@ -254,14 +254,15 @@ void Preprocessor::Handle_Pragma(Token &Tok) {
"Invalid string token!");
// Remove escaped quotes and escapes.
- for (unsigned i = 1, e = StrVal.size(); i < e-2; ++i) {
- if (StrVal[i] == '\\' &&
- (StrVal[i+1] == '\\' || StrVal[i+1] == '"')) {
+ unsigned ResultPos = 1;
+ for (unsigned i = 1, e = StrVal.size() - 2; i != e; ++i) {
+ if (StrVal[i] != '\\' ||
+ (StrVal[i + 1] != '\\' && StrVal[i + 1] != '"')) {
// \\ -> '\' and \" -> '"'.
- StrVal.erase(StrVal.begin()+i);
- --e;
+ StrVal[ResultPos++] = StrVal[i];
}
}
+ StrVal.erase(StrVal.begin() + ResultPos, StrVal.end() - 2);
}
// Remove the front quote, replacing it with a space, so that the pragma
OpenPOWER on IntegriCloud