re PR c++/38705 (ICE: canonical types differ for identical types const int and const AlpsNodeIndex_t)

PR c++/38705
	* builtins.c (fold_builtin_memory_op): Give up if either operand
	is volatile.  Set srctype or desttype to non-qualified version
	of the other type.

	* g++.dg/torture/pr38705.C: New test.

From-SVN: r143029
This commit is contained in:
Jakub Jelinek 2009-01-03 01:54:40 +01:00 committed by Jakub Jelinek
parent 5f26a23027
commit 493aa551b2
4 changed files with 42 additions and 5 deletions

View file

@ -1,5 +1,10 @@
2009-01-03 Jakub Jelinek <jakub@redhat.com>
PR c++/38705
* builtins.c (fold_builtin_memory_op): Give up if either operand
is volatile. Set srctype or desttype to non-qualified version
of the other type.
PR c/38700
* builtins.c (fold_builtin_expect): Only check DECL_WEAK for VAR_DECLs
and FUNCTION_DECLs.

View file

@ -8907,7 +8907,9 @@ fold_builtin_memory_op (tree dest, tree src, tree len, tree type, bool ignore, i
|| !TYPE_SIZE_UNIT (srctype)
|| !TYPE_SIZE_UNIT (desttype)
|| TREE_CODE (TYPE_SIZE_UNIT (srctype)) != INTEGER_CST
|| TREE_CODE (TYPE_SIZE_UNIT (desttype)) != INTEGER_CST)
|| TREE_CODE (TYPE_SIZE_UNIT (desttype)) != INTEGER_CST
|| TYPE_VOLATILE (srctype)
|| TYPE_VOLATILE (desttype))
return NULL_TREE;
src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
@ -8924,7 +8926,7 @@ fold_builtin_memory_op (tree dest, tree src, tree len, tree type, bool ignore, i
{
srcvar = build_fold_indirect_ref (src);
if (TREE_THIS_VOLATILE (srcvar))
srcvar = NULL_TREE;
return NULL_TREE;
else if (!tree_int_cst_equal (lang_hooks.expr_size (srcvar), len))
srcvar = NULL_TREE;
/* With memcpy, it is possible to bypass aliasing rules, so without
@ -8942,7 +8944,7 @@ fold_builtin_memory_op (tree dest, tree src, tree len, tree type, bool ignore, i
{
destvar = build_fold_indirect_ref (dest);
if (TREE_THIS_VOLATILE (destvar))
destvar = NULL_TREE;
return NULL_TREE;
else if (!tree_int_cst_equal (lang_hooks.expr_size (destvar), len))
destvar = NULL_TREE;
else if (!var_decl_component_p (destvar))
@ -8958,7 +8960,7 @@ fold_builtin_memory_op (tree dest, tree src, tree len, tree type, bool ignore, i
if (TREE_ADDRESSABLE (TREE_TYPE (destvar)))
return NULL_TREE;
srctype = desttype;
srctype = build_qualified_type (desttype, 0);
if (src_align < (int) TYPE_ALIGN (srctype))
{
if (AGGREGATE_TYPE_P (srctype)
@ -8980,7 +8982,7 @@ fold_builtin_memory_op (tree dest, tree src, tree len, tree type, bool ignore, i
if (TREE_ADDRESSABLE (TREE_TYPE (srcvar)))
return NULL_TREE;
desttype = srctype;
desttype = build_qualified_type (srctype, 0);
if (dest_align < (int) TYPE_ALIGN (desttype))
{
if (AGGREGATE_TYPE_P (desttype)

View file

@ -1,5 +1,8 @@
2009-01-03 Jakub Jelinek <jakub@redhat.com>
PR c++/38705
* g++.dg/torture/pr38705.C: New test.
PR c/38700
* gcc.dg/pr38700.c: New test.

View file

@ -0,0 +1,27 @@
// PR c++/38705
// { dg-do compile }
typedef int T;
typedef __SIZE_TYPE__ size_t;
extern "C" void *memcpy (void *, const void *, size_t);
void
foo (char *p, const int q)
{
memcpy (p, &q, sizeof (int));
}
struct S
{
T t;
int u;
int bar () const;
template <class T> void foo (const T &x) const {}
};
int
S::bar () const
{
foo (u);
foo (t);
}