]> granicus.if.org Git - clang/commitdiff
implement PR3940: #line numbers not fully checked
authorChris Lattner <sabre@nondot.org>
Fri, 17 Apr 2009 23:37:49 +0000 (23:37 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 17 Apr 2009 23:37:49 +0000 (23:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69403 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticLexKinds.td
lib/Lex/PPDirectives.cpp
test/Preprocessor/line-directive.c

index 77406f5652db81331194f735acbd2194db8ef668..92e134963d08f847b55bf5ce528a1cc1163d32cf 100644 (file)
@@ -223,6 +223,8 @@ def err_pp_line_requires_integer : Error<
   "#line directive requires a positive integer argument">;
 def err_pp_line_invalid_filename : Error<
   "invalid filename for #line directive">;
+def warn_pp_line_decimal : Warning<
+  "#line directive requires decimal line number">;
 def err_pp_linemarker_requires_integer : Error<
   "line marker directive requires a positive integer argument">;
 def err_pp_linemarker_invalid_filename : Error<
index ce86d0edca04123c00954ec3c906fb2e0b4cb4eb..2dfb6233bdf4983a6ffd0b41b954e2c273b1acac 100644 (file)
@@ -650,6 +650,11 @@ static bool GetLineValue(Token &DigitTok, unsigned &Val,
     return true;
   }
   
+  // Warn about hex and octal line numbers.  Do this after the check for 0,
+  // because it is octal.
+  if (Literal.getRadix() != 10) 
+    PP.Diag(DigitTok, diag::warn_pp_line_decimal);
+  
   return false;
 }
 
index 1dd8b292d2e7f015eba443219b5d398050c40ef3..8877406adc23adf6de82ede28120963f9c4c0fc3 100644 (file)
@@ -68,3 +68,5 @@ typedef int w;  // expected-error {{redefinition of typedef 'w' is invalid in C}
 #line 2 "foo.c" EMPTY( )
 #line 2 "foo.c" NONEMPTY( )  // expected-warning{{extra tokens at end of #line directive}}
 
+// PR3940
+#line 0xf  // expected-warning {{#line directive requires decimal line number}}