[cfe-dev] C90 conformance: return statements without expressions in non-void functions

Ken Dyck Ken.Dyck at onsemi.com
Tue Sep 14 10:25:52 PDT 2010



On Tuesday, September 14, 2010 12:01 PM, Chris Lattner
> 
> On Sep 14, 2010, at 8:39 AM, Douglas Gregor
> wrote:
> >> The C99 macro is defined when testing
> against the C99 standard and is
> >> undefined for C90.
> >>
> >> This code fails to compile with Clang in
> the C90 case:
> >>
> >>> clang -S -x c -std=iso9899:1990 -o -
> test2.c
> >> test2.c:19:5: error: non-void function
> 'yfunc' should return a value
> >>       [-Wreturn-type]
> >>     return;
> >>     ^
> >> 1 error generated.
> >>
> >> Section 6.6.4 of C90 reads, "If a return
> statement without an expression
> >> is executed, and the value of the function
> call is used by the caller,
> >> the behavior is undefined." The standard
> says nothing (at least that
> >> I've found) about the case where the value
> of the function is _not_
> >> used, which happens to be the case for
> yfunc() in the context of the
> >> validation suite.
> >>
> >> Can any language lawyers comment on
> whether yfunc() should compile in
> >> C90 mode?
> >
> >
> > I don't know the C90 standard well, but
> from the statement you quote it seems that
> Clang is non-conformant.
> >
> > That said, from a user's perspective, Clang
> is doing the right thing: writing a "return"
> statement with no expression, in a function
> that has a non-void return type, is asking
> for trouble, and we're doing users a favor by
> rejecting it outright. Plum Hall isn't
> helping anyone by checking this.
> 
> We're doing the right thing here.  That error
> is actually a warning that is mapped to an
> error.  If you want full c90 conformance, you
> should pass -Wno-return-type or -Wreturn-
> type.  

That seems to disable more errors than are allowed by C90. The one
constraint C90 imposes in 6.6.6.4 is, "A return statement with an
expression shall not appear in a function whose return type is void."
With, -Wno-return-type or -Wreturn-type, Clang generates warnings
instead of errors for:

  void superfluous_return_expr(void) 
  {
    return 0;
  }

> However, I could be convinced that the
> default mapping in -std=c89 mode (but not -
> std=gnu89 mode) should be to warning.  If
> you're interested, please prepare a patch for
> that.

I'm interested but might not get to it for a while. Shall I file a bug
in the meantime?

-Ken




More information about the cfe-dev mailing list