Commit 493aa551 by Jakub Jelinek Committed by Jakub Jelinek

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

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
parent 5f26a230
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.
......
......@@ -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)
......
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.
......
// 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);
}
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