compiler: reject integer division by zero constant.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Jun 2013 22:42:35 +0000 (22:42 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Jun 2013 22:42:35 +0000 (22:42 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@200436 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/expressions.cc
gcc/testsuite/go.test/test/64bit.go
gcc/testsuite/go.test/test/fixedbugs/bug410.go

index 9085a46..2b60d90 100644 (file)
@@ -5848,6 +5848,20 @@ Binary_expression::do_check_types(Gogo*)
          this->set_is_error();
          return;
        }
+      if (this->op_ == OPERATOR_DIV || this->op_ == OPERATOR_MOD)
+       {
+         // Division by a zero integer constant is an error.
+         Numeric_constant rconst;
+         unsigned long rval;
+         if (left_type->integer_type() != NULL
+             && this->right_->numeric_constant_value(&rconst)
+             && rconst.to_unsigned_long(&rval) == Numeric_constant::NC_UL_VALID
+             && rval == 0)
+           {
+             this->report_error(_("integer division by zero"));
+             return;
+           }
+       }
     }
   else
     {
index 7ad28ad..d99d8e8 100644 (file)
@@ -594,6 +594,19 @@ const binaryConstR = "func test%vBinaryR%v(a, add, sub, mul, div, mod, and, or,
        "}\n" +
        "\n"
 
+const binaryConstR0 = "func test%vBinaryR%v(a, add, sub, mul, div, mod, and, or, xor, andnot %v, dodiv bool) {\n" +
+       "       const b %v = %v;\n" +
+       "       const typ = `%s`;\n" +
+       "       if n, op, want := a + b, `+`, add; n != want { ok=false; println(typ, `var`, a, op, `const`, b, `=`, n, `should be`, want); }\n" +
+       "       if n, op, want := a - b, `-`, sub; n != want { ok=false; println(typ, `var`, a, op, `const`, b, `=`, n, `should be`, want); }\n" +
+       "       if n, op, want := a * b, `*`, mul; n != want { ok=false; println(typ, `var`, a, op, `const`, b, `=`, n, `should be`, want); }\n" +
+       "       if n, op, want := a & b, `&`, and; n != want { ok=false; println(typ, `var`, a, op, `const`, b, `=`, n, `should be`, want); }\n" +
+       "       if n, op, want := a | b, `|`, or; n != want { ok=false; println(typ, `var`, a, op, `const`, b, `=`, n, `should be`, want); }\n" +
+       "       if n, op, want := a ^ b, `^`, xor; n != want { ok=false; println(typ, `var`, a, op, `const`, b, `=`, n, `should be`, want); }\n" +
+       "       if n, op, want := a &^ b, `&^`, andnot; n != want { ok=false; println(typ, `var`, a, op, `const`, b, `=`, n, `should be`, want); }\n" +
+       "}\n" +
+       "\n"
+
 const shiftConstL = "func test%vShiftL%v(b uint64, left, right %v) {\n" +
        "       const a %v = %v;\n" +
        "       const typ = `%s`;\n" +
@@ -621,12 +634,20 @@ const shiftConstR = "func test%vShiftR%v(a, left, right %v) {\n" +
 func constTests() {
        for i, a := range int64Values {
                fmt.Fprintf(bout, binaryConstL, "Int64", i, "int64", "int64", a, "int64")
-               fmt.Fprintf(bout, binaryConstR, "Int64", i, "int64", "int64", a, "int64")
+               if a.hi == 0 && a.lo == 0 {
+                       fmt.Fprintf(bout, binaryConstR0, "Int64", i, "int64", "int64", a, "int64")
+               } else {
+                       fmt.Fprintf(bout, binaryConstR, "Int64", i, "int64", "int64", a, "int64")
+               }
                fmt.Fprintf(bout, shiftConstL, "Int64", i, "int64", "int64", a, "int64")
        }
        for i, a := range uint64Values {
                fmt.Fprintf(bout, binaryConstL, "Uint64", i, "uint64", "uint64", a, "uint64")
-               fmt.Fprintf(bout, binaryConstR, "Uint64", i, "uint64", "uint64", a, "uint64")
+               if a.hi == 0 && a.lo == 0 {
+                       fmt.Fprintf(bout, binaryConstR0, "Uint64", i, "uint64", "uint64", a, "uint64")
+               } else {
+                       fmt.Fprintf(bout, binaryConstR, "Uint64", i, "uint64", "uint64", a, "uint64")
+               }
                fmt.Fprintf(bout, shiftConstL, "Uint64", i, "uint64", "uint64", a, "uint64")
        }
        for i, a := range shiftValues {
index 35ecbfc..430ddcb 100644 (file)
@@ -18,7 +18,7 @@ func zzz () {
     for s := range arr {
         x := make([]byte, 10)
         for i := 0; i < 100 ; i++ {
-            x[i] ^= k[i-arr[s].num%0]
+            x[i] ^= k[i-arr[s].num%3]
         }
     }
 }