From: rguenth Date: Thu, 16 Oct 2008 08:19:49 +0000 (+0000) Subject: 2008-10-16 Joseph Myers X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d37e56198f1be3b0cf8404e90b63eb9e0548a3a3;p=thirdparty%2Fgcc.git 2008-10-16 Joseph Myers Richard Guenther PR middle-end/37418 * tree-ssa.c (useless_type_conversion_p_1): Do not treat volatile qualified functions or methods as relevant. * gcc.c-torture/compile/pr37418-1.c, gcc.c-torture/compile/pr37418-2.c, gcc.c-torture/compile/pr37418-3.c, gcc.c-torture/compile/pr37418-4.c: New tests. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@141165 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 057069dc57da..733b18ac80be 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-10-16 Richard Guenther + + PR middle-end/37418 + * tree-ssa.c (useless_type_conversion_p_1): Do not treat + volatile qualified functions or methods as relevant. + 2008-10-16 Jakub Jelinek PR tree-optimization/37525 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8cee6d05feb7..dd4544b61559 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-10-16 Joseph Myers + + PR middle-end/37418 + * gcc.c-torture/compile/pr37418-1.c, + gcc.c-torture/compile/pr37418-2.c, + gcc.c-torture/compile/pr37418-3.c, + gcc.c-torture/compile/pr37418-4.c: New tests. + 2008-10-15 Thomas Koenig PR libfortran/34670 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37418-1.c b/gcc/testsuite/gcc.c-torture/compile/pr37418-1.c new file mode 100644 index 000000000000..dbb1a651ddbd --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37418-1.c @@ -0,0 +1,6 @@ +typedef void ft(int); +void f(int args)__attribute__((noreturn)); +void f2(ft *p __attribute__((noreturn))) +{ + p = f; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37418-2.c b/gcc/testsuite/gcc.c-torture/compile/pr37418-2.c new file mode 100644 index 000000000000..dcc003984acd --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37418-2.c @@ -0,0 +1,6 @@ +typedef void ft(int); +volatile ft f; +void f2(ft *p __attribute__((noreturn))) +{ + p = f; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37418-3.c b/gcc/testsuite/gcc.c-torture/compile/pr37418-3.c new file mode 100644 index 000000000000..5a2c2e81ead0 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37418-3.c @@ -0,0 +1,6 @@ +typedef void ft(int); +void f(int args)__attribute__((const)); +void f2(ft *p __attribute__((const))) +{ + p = f; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37418-4.c b/gcc/testsuite/gcc.c-torture/compile/pr37418-4.c new file mode 100644 index 000000000000..bc872789004b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37418-4.c @@ -0,0 +1,6 @@ +typedef void ft(int); +const ft f; +void f2(ft *p __attribute__((const))) +{ + p = f; +} diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index c53c52874538..8f238a33da62 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1125,9 +1125,14 @@ useless_type_conversion_p_1 (tree outer_type, tree inner_type) { /* Don't lose casts between pointers to volatile and non-volatile qualified types. Doing so would result in changing the semantics - of later accesses. */ - if ((TYPE_VOLATILE (TREE_TYPE (outer_type)) - != TYPE_VOLATILE (TREE_TYPE (inner_type))) + of later accesses. For function types the volatile qualifier + is used to indicate noreturn functions. */ + if (TREE_CODE (TREE_TYPE (outer_type)) != FUNCTION_TYPE + && TREE_CODE (TREE_TYPE (outer_type)) != METHOD_TYPE + && TREE_CODE (TREE_TYPE (inner_type)) != FUNCTION_TYPE + && TREE_CODE (TREE_TYPE (inner_type)) != METHOD_TYPE + && (TYPE_VOLATILE (TREE_TYPE (outer_type)) + != TYPE_VOLATILE (TREE_TYPE (inner_type))) && TYPE_VOLATILE (TREE_TYPE (outer_type))) return false;