diff options
author | Peter Klausler <pklausler@nvidia.com> | 2023-08-21 13:24:27 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2023-08-23 10:20:45 -0700 |
commit | d40e6005db992007d0d856f07eb6c5770a45389b (patch) | |
tree | b3c44e0be130acf35c18e4a8c42095da7f1370d1 /flang/lib/Parser/preprocessor.cpp | |
parent | adaf545a506bd3fd21a7293e27d5a4ae3a4aea31 (diff) | |
download | llvm-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.cpp | 20 |
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)}; |