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:
parent
5f26a23027
commit
493aa551b2
4 changed files with 42 additions and 5 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
27
gcc/testsuite/g++.dg/torture/pr38705.C
Normal file
27
gcc/testsuite/g++.dg/torture/pr38705.C
Normal 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);
|
||||
}
|
Loading…
Add table
Reference in a new issue