r196296 - Issue diagnostic when constructor or destructor

jahanian fjahanian at apple.com
Tue Dec 3 14:12:57 PST 2013


On Dec 3, 2013, at 2:05 PM, Richard Smith <richard at metafoo.co.uk> wrote:

> On Tue, Dec 3, 2013 at 1:46 PM, jahanian <fjahanian at apple.com> wrote:
> 
> On Dec 3, 2013, at 1:19 PM, Arthur O'Dwyer <arthur.j.odwyer at gmail.com> wrote:
> 
> > Richard Smith originally wrote:
> >> This is a frontend bug, not an IRGen bug; the test case is ill-formed. "return;"
> >> can be used in a constructor or destructor, but "return <expression-with-type-void>;"
> >> cannot.
> >
> > Fariborz Jahanian wrote in response to my comments:
> >> There is a big difference here. returning a non-void expression in C::C() is allowed
> >> under an extension warning flag (ext_return_has_expr is ExtWarn<…>) while returning
> >> a void expression in C::C() is always an error.
> >
> > Returning a non-void expression in C::C() is NOT allowed, not in any
> > dialect of C++, as far as I can tell.
> > The codepath under ext_return_has_expr is actually dealing with a GNU
> > C (not C++) extension that allows "return void_expr();" (not
> > "non_void_expr") in a function returning void. Here's how to trigger
> > that diagnostic:
> >
> >    $ clang test.c -Wpedantic -c
> >    test.c:1:26: warning: void function 'bar' should not return void
> > expression [-Wpedantic]
> >    void foo(); void bar() { return foo(); }
> >                             ^      ~~~~~
> >
> > My point stands, as far as I can tell. And the reason you've had so
> > much trouble understanding this code is that it's really convoluted
> > and confusing! We should be trying to *simplify* it, not complicate it
> > by adding EVEN MORE codepaths and inconsistent behavior.
> 
> Code was simple enough to understand. I based my change on Richard’s comment
> that this should not be allowed (-Wpedantic or not).
> 
> void foo(); C::C() { return foo(); }
> 
> This cannot be consolidated with a diagnostic which allows -Wpedantic warning.
> So, another code path added to check for this condition. Feel free to change it provided
> unconditional error remains for above test case.
> 
> What happens if you build this:
> 
> int foo(); C::C() { return foo(); } 
> 
> ... for ARM, with -Wno-return-type? Does that crash too?
No. this works. Problem was trying to returning a ‘void’ expression in IR.

> 
> I was not aware that we had an extension allowing returning a (non-void) value from a function with a 'void' return type, but it appears we do. Does anyone know the history here?
> 
> Since we do have this extension (and assuming we don't intend to remove it), I agree that the return-void-expression and return-non-void-expression cases should behave the same. Within a ctor or dtor, either neither should be allowed as an extension or both should.
> 
> I think we need two changes here: 1) an IRGen fix, similar to Fariborz's original patch, but checking whether we're in a ctor/dtor rather than checking if the returned expression has type 'void', and 2) a tweak to this change, to treat the above case as an extension (to match our existing behavior).

sgtm. Consolidation of the warning/errors is now trivial. I will take a look when I get the chance.

- Thanks, Fariborz


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131203/19c0cf66/attachment.html>


More information about the cfe-commits mailing list