https://gcc.gnu.org/g:cf65235e03d2eb1667624943eae8f7fc355bceaf

commit r15-7894-gcf65235e03d2eb1667624943eae8f7fc355bceaf
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Thu Mar 6 16:07:02 2025 -0800

    c: Fix warning after an error on a return statment [PR60440]
    
    Like r5-6912-g3dbb84276aca10 but this is for the C front-end.
    Basically we have an error on a return statement, we just return
    error_mark_node and then the warning happens as there is no return
    statement. Anyways instead mark the current function for supression
    of the warning instead.
    
            PR c/60440
    
    gcc/c/ChangeLog:
    
            * c-typeck.cc (c_finish_return): Mark the current function
            for supression of the -Wreturn-type if there was an error
            on the return statement.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/Wreturn-mismatch-2.c: Change dg-warning
            for the last -Wreturn-type to dg-bogus.
            * gcc.dg/pr60440-1.c: New test.
    
    Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>

Diff:
---
 gcc/c/c-typeck.cc                         |  7 ++++++-
 gcc/testsuite/gcc.dg/Wreturn-mismatch-2.c |  2 +-
 gcc/testsuite/gcc.dg/pr60440-1.c          | 10 ++++++++++
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index 691b583db3f8..a13989a66076 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -12765,7 +12765,12 @@ c_finish_return (location_t loc, tree retval, tree 
origtype, bool musttail_p)
 
       current_function_returns_value = 1;
       if (t == error_mark_node)
-       return NULL_TREE;
+       {
+         /* Suppress -Wreturn-type for this function.  */
+         if (warn_return_type)
+           suppress_warning (current_function_decl, OPT_Wreturn_type);
+         return NULL_TREE;
+       }
 
       save = in_late_binary_op;
       if (C_BOOLEAN_TYPE_P (TREE_TYPE (res))
diff --git a/gcc/testsuite/gcc.dg/Wreturn-mismatch-2.c 
b/gcc/testsuite/gcc.dg/Wreturn-mismatch-2.c
index 08811024b7e5..52852261a0d6 100644
--- a/gcc/testsuite/gcc.dg/Wreturn-mismatch-2.c
+++ b/gcc/testsuite/gcc.dg/Wreturn-mismatch-2.c
@@ -37,5 +37,5 @@ int
 f7 (void)
 {
   return f1 (); /* { dg-error "void value not ignored as it ought to be" } */
-} /* { dg-warning "control reaches end of non-void\[^\n\r\]*-Wreturn-type" } */
+} /* { dg-bogus "control reaches end of non-void\[^\n\r\]*-Wreturn-type" } */
 
diff --git a/gcc/testsuite/gcc.dg/pr60440-1.c b/gcc/testsuite/gcc.dg/pr60440-1.c
new file mode 100644
index 000000000000..cd179cf1c520
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr60440-1.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-Wreturn-type" } */
+
+/* PR c/60440 */
+/* Don't warn for a missing return when there was an error
+   on the return stamtent. */
+
+int f(int a) {
+  return a + b; /* { dg-error "undeclared" } */
+} /* { dg-bogus "control reaches end of non-void function" } */

Reply via email to