diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9a7c599408f1247f7954b256100cf16ce1cd08fa..caf69f55c34169f0a4b1571038ee152c8218777a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-06-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+	* gcc.dg/cpp/arith-3.c: Add column info.
+	
 2009-06-18  Sandra Loosemore  <sandra@codesourcery.com>
 
 	* gcc.target/arm/fp16-compile-none-2.c: New.
diff --git a/gcc/testsuite/gcc.dg/cpp/arith-3.c b/gcc/testsuite/gcc.dg/cpp/arith-3.c
index 3015d31657acf08765b4eaf118f7e2b6679968d1..2f94e981162b122e3ceb74faa44d3b6128fffdb1 100644
--- a/gcc/testsuite/gcc.dg/cpp/arith-3.c
+++ b/gcc/testsuite/gcc.dg/cpp/arith-3.c
@@ -9,7 +9,7 @@
    Please keep changes to arith-2.c and arith-3.c in sync.  */
 
 /* { dg-do preprocess } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fshow-column" } */
 
 #include <limits.h>
 
@@ -274,7 +274,7 @@
 # error		/* { dg-bogus "error" }  */
 #endif
 
-#if -5 / (2 - 2) /* { dg-error "division by zero" } */
+#if -5 / (2 - 2) /* { dg-error "13:division by zero" } */
 #endif
 
 #if LONG_UDIVISION != LONG_UDIVISION_ANSWER
@@ -286,7 +286,7 @@
 #endif
 
 /* Binary %.  Cannot overflow.  */
-#if -5 % (2 - 2) /* { dg-error "division by zero" } */
+#if -5 % (2 - 2) /* { dg-error "13:division by zero" } */
 #endif
 
 #if TARG_MIN % 1 /* { dg-bogus "overflow" } */
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index e6ef4c31b07f9f70efb9053515d905eec8575585..d7146588f092c386beeb5fd1b55c5b301dc68cb0 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,7 @@
+2009-06-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+	* expr.c (num_div_op): Take explicit location.
+
 2009-06-17  Ian Lance Taylor  <iant@google.com>
 
 	* include/cpplib.h (progname): Don't declare.
diff --git a/libcpp/expr.c b/libcpp/expr.c
index 6887b1656904ace1fcd230ecd374d682743e7e13..96dd2fde24ca93e538b3a40083c4fa59dc70fbce 100644
--- a/libcpp/expr.c
+++ b/libcpp/expr.c
@@ -52,7 +52,8 @@ static cpp_num num_inequality_op (cpp_reader *, cpp_num, cpp_num,
 static cpp_num num_equality_op (cpp_reader *, cpp_num, cpp_num,
 				enum cpp_ttype);
 static cpp_num num_mul (cpp_reader *, cpp_num, cpp_num);
-static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
+static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype,
+			   source_location);
 static cpp_num num_lshift (cpp_num, size_t, size_t);
 static cpp_num num_rshift (cpp_num, size_t, size_t);
 
@@ -1123,7 +1124,7 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
 	case CPP_DIV:
 	case CPP_MOD:
 	  top[-1].value = num_div_op (pfile, top[-1].value,
-				      top->value, top->op);
+				      top->value, top->op, top->loc);
 	  top[-1].loc = top->loc;
 	  break;
 
@@ -1668,10 +1669,13 @@ num_mul (cpp_reader *pfile, cpp_num lhs, cpp_num rhs)
   return result;
 }
 
-/* Divide two preprocessing numbers, returning the answer or the
-   remainder depending upon OP.  */
+/* Divide two preprocessing numbers, LHS and RHS, returning the answer
+   or the remainder depending upon OP. LOCATION is the source location
+   of this operator (for diagnostics).  */
+
 static cpp_num
-num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
+num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op,
+	    source_location location)
 {
   cpp_num result, sub;
   cpp_num_part mask;
@@ -1711,7 +1715,8 @@ num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
   else
     {
       if (!pfile->state.skip_eval)
-	cpp_error (pfile, CPP_DL_ERROR, "division by zero in #if");
+	cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0,
+			     "division by zero in #if");
       return lhs;
     }