diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2013-05-04 10:37:20 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2013-05-04 10:37:20 +0000 |
commit | c2f5f29b8d94d4ab761260b922793987ff721aa4 (patch) | |
tree | 8fe86f4e5a29cd3ef63c89fb5959c4e46e3b8518 /clang/lib/Lex/Pragma.cpp | |
parent | acb8ecd6642708a11d3a53888fd8f7a903445b40 (diff) | |
download | bcm5719-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.cpp | 11 |
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 |