re PR c++/23056 (ICE in write_template_arg_literal, at cp/mangle.c)
PR c++/23056 * typeck.c (ignore_overflows): New helper function. (build_static_cast_1): Use it. * g++.dg/opt/pr23056.C: New test. From-SVN: r103936
This commit is contained in:
parent
1c653a41cf
commit
822971c1ab
|
@ -1,3 +1,9 @@
|
||||||
|
2005-09-06 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/23056
|
||||||
|
* typeck.c (ignore_overflows): New helper function.
|
||||||
|
(build_static_cast_1): Use it.
|
||||||
|
|
||||||
2005-09-06 Kazu Hirata <kazu@codesourcery.com>
|
2005-09-06 Kazu Hirata <kazu@codesourcery.com>
|
||||||
|
|
||||||
* cp-tree.h, decl.c, decl2.c, semantics.c: Fix comment typos.
|
* cp-tree.h, decl.c, decl2.c, semantics.c: Fix comment typos.
|
||||||
|
|
|
@ -4526,6 +4526,37 @@ convert_ptrmem (tree type, tree expr, bool allow_inverse_p,
|
||||||
allow_inverse_p, c_cast_p);
|
allow_inverse_p, c_cast_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If EXPR is an INTEGER_CST and ORIG is an arithmetic constant, return
|
||||||
|
a version of EXPR that has TREE_OVERFLOW and/or TREE_CONSTANT_OVERFLOW
|
||||||
|
set iff they are set in ORIG. Otherwise, return EXPR unchanged. */
|
||||||
|
|
||||||
|
static tree
|
||||||
|
ignore_overflows (tree expr, tree orig)
|
||||||
|
{
|
||||||
|
if (TREE_CODE (expr) == INTEGER_CST
|
||||||
|
&& CONSTANT_CLASS_P (orig)
|
||||||
|
&& TREE_CODE (orig) != STRING_CST
|
||||||
|
&& (TREE_OVERFLOW (expr) != TREE_OVERFLOW (orig)
|
||||||
|
|| TREE_CONSTANT_OVERFLOW (expr)
|
||||||
|
!= TREE_CONSTANT_OVERFLOW (orig)))
|
||||||
|
{
|
||||||
|
if (!TREE_OVERFLOW (orig) && !TREE_CONSTANT_OVERFLOW (orig))
|
||||||
|
/* Ensure constant sharing. */
|
||||||
|
expr = build_int_cst_wide (TREE_TYPE (expr),
|
||||||
|
TREE_INT_CST_LOW (expr),
|
||||||
|
TREE_INT_CST_HIGH (expr));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Avoid clobbering a shared constant. */
|
||||||
|
expr = copy_node (expr);
|
||||||
|
TREE_OVERFLOW (expr) = TREE_OVERFLOW (orig);
|
||||||
|
TREE_CONSTANT_OVERFLOW (expr)
|
||||||
|
= TREE_CONSTANT_OVERFLOW (orig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return expr;
|
||||||
|
}
|
||||||
|
|
||||||
/* Perform a static_cast from EXPR to TYPE. When C_CAST_P is true,
|
/* Perform a static_cast from EXPR to TYPE. When C_CAST_P is true,
|
||||||
this static_cast is being attempted as one of the possible casts
|
this static_cast is being attempted as one of the possible casts
|
||||||
allowed by a C-style cast. (In that case, accessibility of base
|
allowed by a C-style cast. (In that case, accessibility of base
|
||||||
|
@ -4629,13 +4660,8 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
|
||||||
result = convert_from_reference (result);
|
result = convert_from_reference (result);
|
||||||
|
|
||||||
/* Ignore any integer overflow caused by the cast. */
|
/* Ignore any integer overflow caused by the cast. */
|
||||||
if (TREE_CODE (result) == INTEGER_CST
|
result = ignore_overflows (result, orig);
|
||||||
&& CONSTANT_CLASS_P (orig))
|
|
||||||
{
|
|
||||||
TREE_OVERFLOW (result) = TREE_OVERFLOW (orig);
|
|
||||||
TREE_CONSTANT_OVERFLOW (result)
|
|
||||||
= TREE_CONSTANT_OVERFLOW (orig);
|
|
||||||
}
|
|
||||||
/* [expr.static.cast]
|
/* [expr.static.cast]
|
||||||
|
|
||||||
If T is a reference type, the result is an lvalue; otherwise,
|
If T is a reference type, the result is an lvalue; otherwise,
|
||||||
|
@ -4678,12 +4704,7 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
|
||||||
expr = ocp_convert (type, expr, CONV_C_CAST, LOOKUP_NORMAL);
|
expr = ocp_convert (type, expr, CONV_C_CAST, LOOKUP_NORMAL);
|
||||||
|
|
||||||
/* Ignore any integer overflow caused by the cast. */
|
/* Ignore any integer overflow caused by the cast. */
|
||||||
if (TREE_CODE (expr) == INTEGER_CST
|
expr = ignore_overflows (expr, orig);
|
||||||
&& CONSTANT_CLASS_P (orig))
|
|
||||||
{
|
|
||||||
TREE_OVERFLOW (expr) = TREE_OVERFLOW (orig);
|
|
||||||
TREE_CONSTANT_OVERFLOW (expr) = TREE_CONSTANT_OVERFLOW (orig);
|
|
||||||
}
|
|
||||||
return expr;
|
return expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
2005-09-06 Jakub Jelinek <jakub@redhat.com>
|
2005-09-06 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/23056
|
||||||
|
* g++.dg/opt/pr23056.C: New test.
|
||||||
|
|
||||||
PR rtl-optimization/23098
|
PR rtl-optimization/23098
|
||||||
* gcc.target/i386/pr23098.c: New test.
|
* gcc.target/i386/pr23098.c: New test.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
// PR c++/23056
|
||||||
|
// { dg-do compile }
|
||||||
|
|
||||||
|
template <bool T> struct S { virtual ~S(); };
|
||||||
|
void foo ()
|
||||||
|
{
|
||||||
|
static_cast<bool>("Foo");
|
||||||
|
}
|
||||||
|
S<true> a;
|
Loading…
Reference in New Issue