teemperor added a comment.

In D85993#2253465 <https://reviews.llvm.org/D85993#2253465>, @amccarth wrote:

> In D85993#2220724 <https://reviews.llvm.org/D85993#2220724>, @labath wrote:
>
>> Dwarf parser uses `TypeSystemClang::AddMethodToCXXRecordType` instead of 
>> this function to create methods (which is why there are no assertions like 
>> this when using dwarf). Maybe it would be better to change the pdb parser to 
>> use that function instead (as it allows the user to specify not only 
>> accessibility, but also other potentially useful properties of the created 
>> method -- static, virtual, etc.).
>
> The NativePDB AST parser also uses `AddMethodToCXXRecordType`.  It's in 
> udtcompleter.cpp.
>
> But the bug is triggered while the plugin is trying to synthesize the 
> function declaration during a `ResolveSymbolContext` call.  It looks like the 
> DWARF implementation of `ResolveSymbolContext` relies on its AST parser, but 
> the NativePDB one does not.  I'm trying to figure out how to do that.
>
> Also note that `AddMethodToCXXRecordType` just sets whatever access type it's 
> asked to set.  Before calling `AddMethodToCXXRecordType`, the DWARF parser 
> has this gem:
>
>   // Neither GCC 4.2 nor clang++ currently set a valid
>   // accessibility in the DWARF for C++ methods...
>   // Default to public for now...
>   if (attrs.accessibility == eAccessNone)
>     attrs.accessibility = eAccessPublic;
>
> That bit of logic is what prevents the assertion from failing for DWARF.  
> I'll can make the NativePDB AST parser do the same thing.
>
> But that won't fix the bug, since the NativePDB AST parser isn't involved (at 
> least, my breakpoints in the parser never hit during the course of the test). 
>  In the mean time, I'll try to figure out how to get the NativePDB plugin's 
> `ResolveSymbolContext` implementation to use `AddMethodToCXXRecord`.

No idea about the PDB parsing code, but 
`PdbAstBuilder::GetOrCreateFunctionDecl` seems to be the right place. It 
already has a check for when the context is a TagDecl or a namespace, so doing 
the same thing for the CreateFunctionDecl call below should do the trick 
(namespace -> CreateFunctionDecl, TagDecl -> AddMethodToCXXRecordType).

> I'll also assume that, since you don't want my access-fixup in 
> `TypeSystemClang::CreateFunctionDeclaration`, then you also would want me to 
> remove the already-existing such fixup from 
> `TypeSystemClang::CreateFunctionTemplateDecl`.  Does that make sense?

Confusingly FunctionTemplateDecls *can* be inside a record and the name is just 
misleading. The actual specialisations of a FunctionTemplateDecl in a record 
are again CXXMethodDecls, so `CreateFunctionTemplateDecl` is fine:

  struct Foo {                                                                  
  
    template<typename T>                                                        
  
    int x() {                                                                   
  
      return 3;                                                                 
  
    }                                                                           
  
    int foo() {                                                                 
  
      return x<double>();                                                       
  
    }                                                                           
  
  };
  $ clang -fsyntax-only -Xclang -ast-dump  foo.cpp
  ...
  `-CXXRecordDecl 0x7f9849077f50 <method.cpp:1:1, line:9:1> line:1:8 struct Foo 
definition
    |-FunctionTemplateDecl 0x7f98490782d0 <line:2:3, line:5:3> line:3:7 x
    | |-TemplateTypeParmDecl 0x7f98490780f8 <line:2:12, col:21> col:21 typename 
depth 0 index 0 T
    | |-CXXMethodDecl 0x7f9849078230 <line:3:3, line:5:3> line:3:7 x 'int ()'
    | `-CXXMethodDecl 0x7f98490785e0 <line:3:3, line:5:3> line:3:7 used x 'int 
()'
  ...


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

https://reviews.llvm.org/D85993

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

Reply via email to