summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarphaman <arphaman@gmail.com>2013-08-21 13:35:26 +0100
committerarphaman <arphaman@gmail.com>2013-08-21 13:35:26 +0100
commitbd8bcb1fdd07e18515626f99e1803ea17d532133 (patch)
tree412ff45aa8eb9fec6f1fb2aaaeef733ffb003760
parentd347afbe0f819584ec68360c54e3b69a11b42e1b (diff)
downloadflang-bd8bcb1fdd07e18515626f99e1803ea17d532133.tar.gz
fixed number followed by defined operator bug
-rw-r--r--include/flang/Parse/Lexer.h3
-rw-r--r--lib/Parse/Lexer.cpp23
-rw-r--r--test/Lexer/numberConstants.f956
3 files changed, 29 insertions, 3 deletions
diff --git a/include/flang/Parse/Lexer.h b/include/flang/Parse/Lexer.h
index e02b36d515..af0c01c2bb 100644
--- a/include/flang/Parse/Lexer.h
+++ b/include/flang/Parse/Lexer.h
@@ -157,6 +157,7 @@ class Lexer {
char GetNextChar();
char PeekNextChar() const;
+ char PeekNextChar(int Offset) const;
char PeekPrevChar() const;
char GetCurrentChar() const;
@@ -190,6 +191,8 @@ class Lexer {
/// peekNextChar - Peek at the next character, but don't advance the buffer.
char peekNextChar() const { return Text.PeekNextChar(); }
+ char peekNextChar(int Offset) const { return Text.PeekNextChar(Offset); }
+
/// peekPrevChar - Peek at the previous character.
char peekPrevChar() const { return Text.PeekPrevChar(); }
diff --git a/lib/Parse/Lexer.cpp b/lib/Parse/Lexer.cpp
index 35767bf562..b702d62149 100644
--- a/lib/Parse/Lexer.cpp
+++ b/lib/Parse/Lexer.cpp
@@ -402,6 +402,21 @@ char Lexer::LineOfText::PeekNextChar() const {
return Atom.data()[CurPtr + 1];
}
+char Lexer::LineOfText::PeekNextChar(int Offset) const {
+ auto CurrentAtom = CurAtom;
+ auto Ptr = CurPtr;
+ while(Ptr + Offset >= Atoms[CurrentAtom].size() && Offset > 0) {
+ Offset -= (Atoms[CurrentAtom].size() - Ptr);
+ Ptr = 0;
+ ++CurrentAtom;
+ if(CurrentAtom >= Atoms.size())
+ return '\0';
+ }
+ StringRef Atom = Atoms[CurrentAtom];
+ assert(!Atom.empty() && "Atom has no contents!");
+ return Atom.data()[Ptr + Offset];
+}
+
char Lexer::LineOfText::PeekPrevChar() const {
if (Atoms.empty()) return '\0';
StringRef Atom = Atoms[CurAtom];
@@ -1045,9 +1060,11 @@ void Lexer::LexNumericConstant(Token &Result) {
PrevChar = '\0';
}
else if(C == 'E' || C == 'e' || C == 'D' || C == 'd') {
- getNextChar();
- IsReal = true;
- IsExp = true;
+ if(!isLetter(peekNextChar(2))) {
+ getNextChar();
+ IsReal = true;
+ IsExp = true;
+ }
} else PrevChar = '\0';
}
diff --git a/test/Lexer/numberConstants.f95 b/test/Lexer/numberConstants.f95
index af7774e48c..c899764d4d 100644
--- a/test/Lexer/numberConstants.f95
+++ b/test/Lexer/numberConstants.f95
@@ -20,6 +20,12 @@ PROGRAM constants
if(1.LT.2) then
end if
+ if(1.eq.2) then
+ end if
+
+ if(1.ne.2) then
+ end if
+
X = 1e ! expected-error {{exponent has no digits}}
Y = -2D- ! expected-error {{exponent has no digits}}
END PROGRAM constants