diff --git a/flang/lib/Parser/preprocessor.cpp b/flang/lib/Parser/preprocessor.cpp --- a/flang/lib/Parser/preprocessor.cpp +++ b/flang/lib/Parser/preprocessor.cpp @@ -296,16 +296,18 @@ 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)}; diff --git a/flang/lib/Parser/token-sequence.h b/flang/lib/Parser/token-sequence.h --- a/flang/lib/Parser/token-sequence.h +++ b/flang/lib/Parser/token-sequence.h @@ -61,11 +61,17 @@ std::size_t SizeInTokens() const { return start_.size(); } std::size_t SizeInChars() const { return char_.size(); } - CharBlock ToCharBlock() const { return {&char_[0], char_.size()}; } + CharBlock ToCharBlock() const { + return char_.empty() ? CharBlock{} : CharBlock{&char_[0], char_.size()}; + } std::string ToString() const { return ToCharBlock().ToString(); } CharBlock TokenAt(std::size_t token) const { - return {&char_[start_.at(token)], TokenBytes(token)}; + if (auto bytes{TokenBytes(token)}) { + return {&char_[start_.at(token)], bytes}; + } else { // char_ could be empty + return {}; + } } char CharAt(std::size_t j) const { return char_.at(j); } CharBlock CurrentOpenToken() const { diff --git a/flang/test/Preprocessing/bug64837.F90 b/flang/test/Preprocessing/bug64837.F90 new file mode 100644 --- /dev/null +++ b/flang/test/Preprocessing/bug64837.F90 @@ -0,0 +1,4 @@ +! RUN: %flang -E -DMACRO= %s 2>&1 | FileCheck %s +!CHECK: integer, parameter :: p = +1 +integer, parameter :: p = MACRO +1 +end