martong added a comment.

Hey Alexey,

Here is what I found so far:
The new assertion is this:

  Assertion failed: (ToRD == ToD->getDeclContext() && ToRD->containsDecl(ToD)), 
function ImportDeclContext

ToRD looks like this in code:

  typedef struct __sFILE {
     // several fields here ...
  } FILE;

And the AST:

  CXXRecordDecl 0x7f87ce97d488 
</Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/_stdio.h:126:9,
 col:16> col:16 struct __sFILE definition
  |-DefinitionData pass_in_registers aggregate standard_layout 
trivially_copyable pod trivial literal
  | |-DefaultConstructor exists trivial needs_implicit
  | |-CopyConstructor simple trivial has_const_param needs_implicit 
implicit_has_const_param
  | |-MoveConstructor exists simple trivial needs_implicit
  | |-CopyAssignment trivial has_const_param needs_implicit 
implicit_has_const_param
  | |-MoveAssignment exists simple trivial needs_implicit
  | `-Destructor simple irrelevant trivial needs_implicit
  |-CXXRecordDecl 0x7f87d1886000 <col:9, col:16> col:16 implicit struct __sFILE
  | `-<undeserialized declarations>
  `-<undeserialized declarations>

I dug deeper and this is because `ToRD` is not equal with 
`ToD->getDeclContext()`.
However, if I load the fields of `ToRD` and then dump it seems to be 
structurally equivalent with `ToD->getDeclContext()`.
Both `ToRD` and `ToD->getDeclContext()` are part of a Decl chain with one 
element, this is true for `FromRD` and `D->getDeclContext()`. So I suspect some 
sort of lookup problem here: first we import the declContext during the import 
of a field, then when we do `auto ImportedDC = import(cast<Decl>(FromDC));` 
where we fail to find the first imported DeclContext. I suspect that this is 
because typedef hides the real struct, I mean `__sFILE` seems to be not 
find-able by normal C lookup (ie. it is hidden).

Here is one workaround (I did not try it yet):
We could lazy initialize `ToRD` inside the for loop to be equal to the first 
'ToD`'s decl context.

  RecordDecl *ToRD = nullptr;
  for (auto *D : FromRD->decls()) {
    if (isa<FieldDecl>(D) || isa<FriendDecl>(D)) {
      Decl *ToD = Importer.GetAlreadyImportedOrNull(D);
      if (!ToRD)
          ToRD = ToD->getDeclContext();
      ToRD->removeDecl(ToD);
    }
  }

I am afraid I can continue with the debug only next week.


Repository:
  rC Clang

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

https://reviews.llvm.org/D44100



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

Reply via email to