dblaikie added a comment.

In D70524#1787566 <https://reviews.llvm.org/D70524#1787566>, @SouraVX wrote:

> > It looks like this implementation is a bit buggy in one way and incomplete 
> > in another:
> > 
> > 1. even if the auto-returning function is defined, that function definition 
> > doesn't describe the concrete return type. Compare GCC and Clang's output 
> > for your example and note that... oh.
>
> I think that's correct behavior, consider this for a moment --
>
>   struct foo {
>   auto foo_func();
>   };
>   int foo::foo_func(){return 0;}
>   clang error: ->
>   error: return type of out-of-line definition of 'foo::foo_func' differs 
> from that in the declaration
>
>
> So this seems fair to me, regardless of the concrete return type{assuming 
> this is what this patch is doing}. We should be emitting `auto` in 
> declaration. AKA in unspecified_type. GCC(trunk) also seems fair here.


Sorry, the example I had in mind was this:

  struct type {
    auto func();
  };
  auto type::func() {
    return 3;
  }

Which GCC produces:

  DW_TAG_structure_type
    DW_AT_name ("type")
    DW_TAG_subprogram
      DW_AT_name ("func")
      DW_AT_type (DW_TAG_unspecified_type "auto")
      ...
  DW_TAG_subprogram
    DW_AT_specification (... ^)
    DW_AT_type (DW_TAG_base_type "int")
    ...

(this should be the same debug info even if the function is defined inline in 
the class, rather than defined out of line (assuming the function's called - 
which produces a definition))

>> Hmm, maybe this feature/suggestion is broken or at least not exactly awesome 
>> when it comes to auto-returning functions that are eventually void-returning 
>> functions? Now the function definition has no DW_AT_type to override the 
>> unspecified_type in the declaration... :/ that's unfortunate (@probinson - 
>> thoughts?)
> 
> I'm a bit confused here, regardless of the concrete return 
> type{void/int/float} GCC(trunk) is emitting 
>  `DW_TAG_unspecified_type`
>  `DW_AT_name "auto"` 
>  Are you trying to say we should be emitting `DW_AT_type void/int/float` ?? 
> That's what functionality of clang is right now, and if we entertain that, 
> then their is no point of emitting `DW_TAG_unspecifed_type auto` at first 
> place.

As @probinson said - for the definition DIE/DISubprogram the type should be the 
concrete, deduced type. For the declaration DIE/DISubprogram, the return type 
should be "auto".


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70524/new/

https://reviews.llvm.org/D70524



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to