diff --git a/include/bolt/Scanner.hpp b/include/bolt/Scanner.hpp index 73c2cc44f..3acbbd031 100644 --- a/include/bolt/Scanner.hpp +++ b/include/bolt/Scanner.hpp @@ -54,6 +54,7 @@ namespace bolt { enum class FrameType { Block, LineFold, + Fallthrough, }; class Punctuator : public BufferedStream { diff --git a/src/Scanner.cc b/src/Scanner.cc index 5f6b8a89d..505fe8364 100644 --- a/src/Scanner.cc +++ b/src/Scanner.cc @@ -378,22 +378,40 @@ after_string_contents: auto T0 = Tokens.peek(); - if (llvm::isa(T0)) { - if (Frames.size() == 1) { - return T0; - } - auto Frame = Frames.top(); - Frames.pop(); - switch (Frame) { - case FrameType::Block: - return new BlockEnd(T0->getStartLoc()); - case FrameType::LineFold: - return new LineFoldEnd(T0->getStartLoc()); + switch (T0->getKind()) { + case NodeKind::LBrace: + Frames.push(FrameType::Fallthrough); + break; + case NodeKind::EndOfFile: + { + if (Frames.size() == 1) { + return T0; + } + auto Frame = Frames.top(); + Frames.pop(); + switch (Frame) { + case FrameType::Fallthrough: + break; + case FrameType::Block: + return new BlockEnd(T0->getStartLoc()); + case FrameType::LineFold: + return new LineFoldEnd(T0->getStartLoc()); + } } + default: + break; } auto RefLoc = Locations.top(); switch (Frames.top()) { + case FrameType::Fallthrough: + { + if (T0->getKind() == NodeKind::RBrace) { + Frames.pop(); + } + Tokens.get(); + return T0; + } case FrameType::LineFold: { if (T0->getStartLine() > RefLoc.Line