]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2008-10-16 Joseph Myers <joseph@codesourcery.com>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Oct 2008 08:19:49 +0000 (08:19 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Oct 2008 08:19:49 +0000 (08:19 +0000)
        Richard Guenther  <rguenther@suse.de>

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr37418-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr37418-2.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr37418-3.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr37418-4.c [new file with mode: 0644]
gcc/tree-ssa.c

index 057069dc57da0c55e7b9511f6d39f5bb14b86ace..733b18ac80befebfc00cf91d22ca042baaf36854 100644 (file)
@@ -1,3 +1,9 @@
+2008-10-16  Richard Guenther  <rguenther@suse.de>
+
+       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  <jakub@redhat.com>
 
        PR tree-optimization/37525
index 8cee6d05feb7bcdeaff656fcf35204b817a9f460..dd4544b615590d1e9939fbd55f53c02b44b162fd 100644 (file)
@@ -1,3 +1,11 @@
+2008-10-16  Joseph Myers  <joseph@codesourcery.com>
+
+       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  <tkoenig@gcc.gnu.org>
 
        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 (file)
index 0000000..dbb1a65
--- /dev/null
@@ -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 (file)
index 0000000..dcc0039
--- /dev/null
@@ -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 (file)
index 0000000..5a2c2e8
--- /dev/null
@@ -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 (file)
index 0000000..bc87278
--- /dev/null
@@ -0,0 +1,6 @@
+typedef void ft(int);
+const ft f;
+void f2(ft *p __attribute__((const)))
+{
+  p = f;
+}
index c53c528745388a10368ab82feff91baa7ea0019c..8f238a33da625d8867cbf32f72d35ceeadb8d397 100644 (file)
@@ -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;