re PR c++/28986 (Failure to diagnose overflow in constant expression)

2007-01-07  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	PR c++/28986
cp/
	* typeck.c (build_binary_op): Call overflow_warning if
	TREE_OVERFLOW_P is true for the result and not for any of the
	operands.

testsuite/
	* g++.dg/conversion/nullptr1.C: Added overflow warning.
	* g++.dg/warn/overflow-warn-1.C: New.
	* g++.dg/warn/overflow-warn-3.C: New.
	* g++.dg/warn/overflow-warn-4.C: New.
	* g++.dg/warn/overflow-warn-5.C: New.
	* g++.dg/warn/overflow-warn-6.C: New.
	* g++.dg/warn/Woverflow-1.C: New.
	* g++.dg/warn/Woverflow-2.C: New.
	* g++.dg/warn/Woverflow-3.C: New.
	* g++.dg/warn/multiple-overflow-warn-2.C: New.

From-SVN: r120558
parent 636dff67
2007-01-07 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/28986
* typeck.c (build_binary_op): Call overflow_warning if
TREE_OVERFLOW_P is true for the result and not for any of the
operands.
2007-01-06 Lee Millward <lee.millward@codesourcery.com>
PR c++/19439
......
......@@ -3870,6 +3870,12 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
result = fold_if_not_in_template (result);
if (final_type != 0)
result = cp_convert (final_type, result);
if (TREE_OVERFLOW_P (result)
&& !TREE_OVERFLOW_P (op0)
&& !TREE_OVERFLOW_P (op1))
overflow_warning (result);
return result;
}
......
2007-01-07 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/28986
* g++.dg/conversion/nullptr1.C: Added overflow warning.
* g++.dg/warn/overflow-warn-1.C: New.
* g++.dg/warn/overflow-warn-3.C: New.
* g++.dg/warn/overflow-warn-4.C: New.
* g++.dg/warn/overflow-warn-5.C: New.
* g++.dg/warn/overflow-warn-6.C: New.
* g++.dg/warn/Woverflow-1.C: New.
* g++.dg/warn/Woverflow-2.C: New.
* g++.dg/warn/Woverflow-3.C: New.
* g++.dg/warn/multiple-overflow-warn-2.C: New.
2007-01-07 Bernhard Fischer <aldot@gcc.gnu.org>
PR fortran/27698
......@@ -6,5 +6,5 @@
void *p = 0;
void *q = 0 * (INT_MAX + 1); // { dg-error "invalid conversion" }
// { dg-warning "integer overflow in expression" "" { target *-*-* } 8 }
/* { dg-do compile } */
/* { dg-options "-O2" } */
#include <limits.h>
int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */
/* { dg-do compile } */
/* { dg-options "-O2" } */
#include <limits.h>
int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */
/* { dg-do compile } */
/* { dg-options "-O2" } */
#include <limits.h>
int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */
/* { dg-do compile } */
/* { dg-options "-O2 -Woverflow" } */
#include <limits.h>
int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */
/* { dg-do compile } */
/* { dg-options "-O2 -Woverflow" } */
#include <limits.h>
int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */
/* { dg-do compile } */
/* { dg-options "-O2 -Woverflow" } */
#include <limits.h>
int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */
/* { dg-do compile } */
/* { dg-options "-O2 -Wno-overflow" } */
#include <limits.h>
int foo = INT_MAX + 1;
/* { dg-do compile } */
/* { dg-options "-O2 -Wno-overflow" } */
#include <limits.h>
int foo = INT_MAX + 1;
/* { dg-do compile } */
/* { dg-options "-O2 -Wno-overflow" } */
#include <limits.h>
int foo = INT_MAX + 1;
/* PR c/19978 : Test for duplicated warnings (binary operators). */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
#include <limits.h>
int
g1 (void)
{
return INT_MAX + 1 - INT_MAX; /* { dg-bogus "integer overflow in expression.*integer overflow in expression" } */
/* { dg-warning "integer overflow in expression" "" { target *-*-* } 10 } */
}
/* PR c/19978 : Test for duplicated warnings (binary operators). */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
#include <limits.h>
int
g1 (void)
{
return INT_MAX + 1 - INT_MAX; /* { dg-bogus "integer overflow in expression.*integer overflow in expression" } */
/* { dg-warning "integer overflow in expression" "" { target *-*-* } 10 } */
}
/* PR c/19978 : Test for duplicated warnings (binary operators). */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
#include <limits.h>
int
g1 (void)
{
return INT_MAX + 1 - INT_MAX; /* { dg-bogus "integer overflow in expression.*integer overflow in expression" } */
/* { dg-warning "integer overflow in expression" "" { target *-*-* } 10 } */
}
/* PR c/27273 */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
unsigned char rx_async(unsigned char p) {
return p & 512; /* { dg-warning "overflow in implicit constant conversion" } */
}
/* PR c/27273 */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
unsigned char rx_async(unsigned char p) {
return p & 512; /* { dg-warning "overflow in implicit constant conversion" } */
}
/* PR c/27273 */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
unsigned char rx_async(unsigned char p) {
return p & 512; /* { dg-warning "overflow in implicit constant conversion" } */
}
/* Test non-constant operands in overflowed expressions. */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
#include <limits.h>
int
h1 (int x)
{
return x * (0 * (INT_MAX + 1)); /* { dg-warning "warning: integer overflow in expression" } */
}
int
h2 (int x)
{
return ((INT_MAX + 1) * 0) * x; /* { dg-warning "warning: integer overflow in expression" } */
}
/* Test non-constant operands in overflowed expressions. */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
#include <limits.h>
int
h1 (int x)
{
return x * (0 * (INT_MAX + 1)); /* { dg-warning "warning: integer overflow in expression" } */
}
int
h2 (int x)
{
return ((INT_MAX + 1) * 0) * x; /* { dg-warning "warning: integer overflow in expression" } */
}
/* Test non-constant operands in overflowed expressions. */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
#include <limits.h>
int
h1 (int x)
{
return x * (0 * (INT_MAX + 1)); /* { dg-warning "warning: integer overflow in expression" } */
}
int
h2 (int x)
{
return ((INT_MAX + 1) * 0) * x; /* { dg-warning "warning: integer overflow in expression" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment