aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Parser/preprocessor.cpp
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2023-08-21 13:24:27 -0700
committerPeter Klausler <pklausler@nvidia.com>2023-08-23 10:20:45 -0700
commitd40e6005db992007d0d856f07eb6c5770a45389b (patch)
treeb3c44e0be130acf35c18e4a8c42095da7f1370d1 /flang/lib/Parser/preprocessor.cpp
parentadaf545a506bd3fd21a7293e27d5a4ae3a4aea31 (diff)
downloadllvm-d40e6005db992007d0d856f07eb6c5770a45389b.zip
llvm-d40e6005db992007d0d856f07eb6c5770a45389b.tar.gz
llvm-d40e6005db992007d0d856f07eb6c5770a45389b.tar.bz2
[flang] Fix crash from empty -DMACRO= (bug #64837)
Some vector indexing code in the preprocessor fails with empty tokens or token sequences in predefined macros. Fixes https://github.com/llvm/llvm-project/issues/64837. Differential Revision: https://reviews.llvm.org/D158451
Diffstat (limited to 'flang/lib/Parser/preprocessor.cpp')
-rw-r--r--flang/lib/Parser/preprocessor.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/flang/lib/Parser/preprocessor.cpp b/flang/lib/Parser/preprocessor.cpp
index c78a9e1..5af1632 100644
--- a/flang/lib/Parser/preprocessor.cpp
+++ b/flang/lib/Parser/preprocessor.cpp
@@ -296,16 +296,18 @@ std::optional<TokenSequence> Preprocessor::MacroReplacement(
if (!def->isFunctionLike()) {
bool isRenaming{false};
if (def->isPredefined()) {
- std::string name{def->replacement().TokenAt(0).ToString()};
std::string repl;
- if (name == "__FILE__") {
- repl = "\""s +
- allSources_.GetPath(prescanner.GetCurrentProvenance()) + '"';
- } else if (name == "__LINE__") {
- std::string buf;
- llvm::raw_string_ostream ss{buf};
- ss << allSources_.GetLineNumber(prescanner.GetCurrentProvenance());
- repl = ss.str();
+ if (!def->replacement().empty()) {
+ std::string name{def->replacement().TokenAt(0).ToString()};
+ if (name == "__FILE__") {
+ repl = "\""s +
+ allSources_.GetPath(prescanner.GetCurrentProvenance()) + '"';
+ } else if (name == "__LINE__") {
+ std::string buf;
+ llvm::raw_string_ostream ss{buf};
+ ss << allSources_.GetLineNumber(prescanner.GetCurrentProvenance());
+ repl = ss.str();
+ }
}
if (!repl.empty()) {
ProvenanceRange insert{allSources_.AddCompilerInsertion(repl)};