c-typeck.c (function_types_compatible_p): Ignore incompatible 'volatile' qualifiers...
authorGeoffrey Keating <geoffk@apple.com>
Wed, 30 Apr 2003 01:28:39 +0000 (01:28 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Wed, 30 Apr 2003 01:28:39 +0000 (01:28 +0000)
2003-04-29  Geoffrey Keating  <geoffk@apple.com>

* c-typeck.c (function_types_compatible_p): Ignore incompatible
'volatile' qualifiers on a function's return type in GNU mode.

Index: testsuite/ChangeLog
2003-04-29  Geoffrey Keating  <geoffk@apple.com>

* gcc.dg/noreturn-5.c: New file.
* gcc.dg/noreturn-6.c: New file.

From-SVN: r66281

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/noreturn-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/noreturn-6.c [new file with mode: 0644]

index af70aedd081b7446f012d47c1df5493aba2e9edf..3b4d998f80accb68be28e93de3eae880745fd905 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-29  Geoffrey Keating  <geoffk@apple.com>
+
+       * c-typeck.c (function_types_compatible_p): Ignore incompatible
+       'volatile' qualifiers on a function's return type in GNU mode.
+
 2003-04-29  Aldy Hernandez  <aldyh@redhat.com>
 
         * expr.c (emit_group_load): Dump parallels of simd types to
index 33bce26ede62e16a360534e5285006b45d2fda05..cfa2d409cc9a8656216507cecbf383329b9fb03b 100644 (file)
@@ -630,9 +630,23 @@ function_types_compatible_p (f1, f2)
   /* 1 if no need for warning yet, 2 if warning cause has been seen.  */
   int val = 1;
   int val1;
-
-  if (!(TREE_TYPE (f1) == TREE_TYPE (f2)
-       || (val = comptypes (TREE_TYPE (f1), TREE_TYPE (f2)))))
+  tree ret1, ret2;
+
+  ret1 = TREE_TYPE (f1);
+  ret2 = TREE_TYPE (f2);
+
+  /* 'volatile' qualifiers on a function's return type mean the function
+     is noreturn.  */
+  if (pedantic && TYPE_VOLATILE (ret1) != TYPE_VOLATILE (ret2))
+    pedwarn ("function return types not compatible due to `volatile'");
+  if (TYPE_VOLATILE (ret1))
+    ret1 = build_qualified_type (TYPE_MAIN_VARIANT (ret1),
+                                TYPE_QUALS (ret1) & ~TYPE_QUAL_VOLATILE);
+  if (TYPE_VOLATILE (ret2))
+    ret2 = build_qualified_type (TYPE_MAIN_VARIANT (ret2),
+                                TYPE_QUALS (ret2) & ~TYPE_QUAL_VOLATILE);
+  val = comptypes (ret1, ret2);
+  if (val == 0)
     return 0;
 
   args1 = TYPE_ARG_TYPES (f1);
index 14607687a2073ae2eed7ee09349887df79fdd2e9..5a7ddceb97c70ff3bf17b185d768494e6118166a 100644 (file)
@@ -1,5 +1,8 @@
 2003-04-29  Geoffrey Keating  <geoffk@apple.com>
 
+       * gcc.dg/noreturn-5.c: New file.
+       * gcc.dg/noreturn-6.c: New file.
+
        * gcc.c-torture/compile/inline-1.c: New file.
 
 2003-04-29  Mark Mitchell  <mark@codesourcery.com>
diff --git a/gcc/testsuite/gcc.dg/noreturn-5.c b/gcc/testsuite/gcc.dg/noreturn-5.c
new file mode 100644 (file)
index 0000000..07381a6
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+/* Check that 'noreturn' and 'volatile extern' are compatible.  
+   The testsuite uses -ansi -pedantic-errors by default, so this has
+   to override.  */
+extern void xxx (int) __attribute__((noreturn));
+__volatile extern void xxx (int);
diff --git a/gcc/testsuite/gcc.dg/noreturn-6.c b/gcc/testsuite/gcc.dg/noreturn-6.c
new file mode 100644 (file)
index 0000000..eb1fd24
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* Check for volatile behaviour.  */
+extern int xxx (void);
+volatile extern int xxx (void);  /* { dg-error "not compatible" } */