Unbreak LLVM on the MSVC compiler:
[oota-llvm.git] / utils / TableGen / TGLexer.cpp
index a6de239e6f6d78d52c7c2caedee3dafed764b63b..0d83e7cdf1bbbb5935717fa039c48effafd4adf5 100644 (file)
 #include <ostream>
 #include "llvm/Config/config.h"
 #include <cctype>
+#include <cstdio>
 #include <cstdlib>
 #include <cstring>
+#include <cerrno>
 using namespace llvm;
 
 TGLexer::TGLexer(MemoryBuffer *StartBuf) : CurLineNo(1), CurBuf(StartBuf) {
@@ -342,7 +344,18 @@ tgtok::TokKind TGLexer::LexNumber() {
       if (CurPtr == NumStart)
         return ReturnError(CurPtr-2, "Invalid hexadecimal number");
 
+      errno = 0;
       CurIntVal = strtoll(NumStart, 0, 16);
+      if (errno == EINVAL)
+        return ReturnError(CurPtr-2, "Invalid hexadecimal number");
+      if (errno == ERANGE) {
+        errno = 0;
+        CurIntVal = (int64_t)strtoull(NumStart, 0, 16);
+        if (errno == EINVAL)
+          return ReturnError(CurPtr-2, "Invalid hexadecimal number");
+        if (errno == ERANGE)
+          return ReturnError(CurPtr-2, "Hexadecimal number out of range");
+      }
       return tgtok::IntVal;
     } else if (CurPtr[0] == 'b') {
       ++CurPtr;