aprantl added a comment.

In D123319#3517966 <https://reviews.llvm.org/D123319#3517966>, @dblaikie wrote:
> In D123319#3506745 <https://reviews.llvm.org/D123319#3506745>, @shafik wrote:
>
>> 
>
> What does the linkage name do for your use case? Which cases are missing 
> linkage names/where do they go missing?
>
>> I am happy to consider other approaches as well to solving lookup for local 
>> lambdas for D105564 <https://reviews.llvm.org/D105564>. Let me know what you 
>> think.
>
> Why does the return type help perform lookup? What kind of lookup?
>
> (again, my take is that "auto" return types probably shouldn't be described 
> at all - we should just not describe functions where we don't know their 
> return types because they're not very useful to know about (overload 
> resolution, yes, but then you can't call them anyway) - but that's a broader 
> argument to make/change to make)

IIUC, the motivating problem is (@shafik please correct me if this isn't it) 
this:

  $ cat /tmp/lambda.cpp 
  #include <cstdio>
  int main() {
    auto f = [](){ printf("hi from lambda\n"); return 1;} ;
    f();
    f();
    return f();
  }
  $ clang++ -g /tmp/lambda.cpp -o /tmp/a.out
  $ lldb /tmp/a.out
  (lldb) b 5
  (lldb) r
  (lldb) p f()
  hi from lambda
  (lldb) p auto val = f()
  error: expression failed to parse:
  error: <user expression 1>:1:6: variable has incomplete type 'void'
  auto val = f()
       ^

LLDB can't determine the return type of the lambda, because it has trouble 
matching up the abstract specification (with the `auto` return type) with the 
concrete definition (with the `int` return type):

  $ dwarfdump --name "operator()" /tmp/a.out.dSYM -p -c
  /tmp/a.out.dSYM/Contents/Resources/DWARF/a.out:       file format Mach-O arm64
  
  0x0000000b: DW_TAG_compile_unit
                DW_AT_producer  ("Apple clang version 13.1.6 
(clang-1316.0.21.2)")
                DW_AT_language  (DW_LANG_C_plus_plus_14)
                DW_AT_name      ("/tmp/lambda.cpp")
                DW_AT_LLVM_sysroot      
("/Library/Developer/CommandLineTools/SDKs/MacOSX13.0.sdk")
                DW_AT_APPLE_sdk ("MacOSX13.0.sdk")
                DW_AT_stmt_list (0x00000000)
                DW_AT_comp_dir  ("/Volumes/Data/swift")
                DW_AT_low_pc    (0x0000000100003f28)
                DW_AT_high_pc   (0x0000000100003f98)
  
  0x000007c6:   DW_TAG_subprogram
                  DW_AT_low_pc  (0x0000000100003f28)
                  DW_AT_high_pc (0x0000000100003f6c)
                  DW_AT_frame_base      (DW_OP_reg29 W29)
                  DW_AT_name    ("main")
                  DW_AT_decl_file       ("/tmp/lambda.cpp")
                  DW_AT_decl_line       (2)
                  DW_AT_type    (0x000000000000029f "int")
                  DW_AT_external        (true)
  
  0x000007ed:     DW_TAG_class_type
                    DW_AT_calling_convention    (DW_CC_pass_by_value)
                    DW_AT_byte_size     (0x01)
                    DW_AT_decl_file     ("/tmp/lambda.cpp")
                    DW_AT_decl_line     (3)
  
  0x000007f2:       DW_TAG_subprogram
                      DW_AT_name        ("operator()")
                      DW_AT_decl_file   ("/tmp/lambda.cpp")
                      DW_AT_decl_line   (3)
                      DW_AT_type        (0x0000000000000806 "auto")
                      DW_AT_declaration (true)
                      DW_AT_accessibility       (DW_ACCESS_public)
  
  0x000007fe:         DW_TAG_formal_parameter
                        DW_AT_type      (0x000000000000080b "const class *")
                        DW_AT_artificial        (true)
  
  0x00000803:         NULL
  
  0x0000000b: DW_TAG_compile_unit
                DW_AT_producer  ("Apple clang version 13.1.6 
(clang-1316.0.21.2)")
                DW_AT_language  (DW_LANG_C_plus_plus_14)
                DW_AT_name      ("/tmp/lambda.cpp")
                DW_AT_LLVM_sysroot      
("/Library/Developer/CommandLineTools/SDKs/MacOSX13.0.sdk")
                DW_AT_APPLE_sdk ("MacOSX13.0.sdk")
                DW_AT_stmt_list (0x00000000)
                DW_AT_comp_dir  ("/Volumes/Data/swift")
                DW_AT_low_pc    (0x0000000100003f28)
                DW_AT_high_pc   (0x0000000100003f98)
  
  0x00000815:   DW_TAG_subprogram
                  DW_AT_low_pc  (0x0000000100003f6c)
                  DW_AT_high_pc (0x0000000100003f98)
                  DW_AT_frame_base      (DW_OP_reg29 W29)
                  DW_AT_object_pointer  (0x00000834)
                  DW_AT_type    (0x000000000000029f "int")
                  DW_AT_linkage_name    ("_ZZ4mainENK3$_0clEv")
                  DW_AT_specification   (0x00000000000007f2 "operator()")
  
  0x00000834:     DW_TAG_formal_parameter
                    DW_AT_location      (DW_OP_breg31 WSP+8)
                    DW_AT_name  ("this")
                    DW_AT_type  (0x0000000000000841 "const class *")
                    DW_AT_artificial    (true)
  
  0x00000840:     NULL


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D123319

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

Reply via email to