[PATCH] D44079: [ASTImporter] Allow testing of import sequences; fix import of typedefs for anonymous decls

Balogh, Ádám via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 6 01:51:07 PST 2018

baloghadamsoftware added a comment.


Thank you for the patch.

It seems that the new approach still does not solve a problem with anonymous structures in typedefs.In C++ a copy constructor is automatically generated, and its parameter is the anonymous structure itself. This triggers caching `NoLinkage` for it during the import of the constructor, but later fails with an assert because at the end the computed linkage is `ExternalLinkage`. It seems that anonymous structures are somewhat tricky in the original AST. For this struct:

  typedef struct {
    int n;
  } T;

the original AST is:

  CXXRecordDecl 0x1abcb38 </tmp/first.cpp:1:9, line:3:1> line:1:9 imported struct definition
  |-FieldDecl 0x1abce68 <line:2:3, col:7> col:7 imported n 'int'
  |-CXXConstructorDecl 0x1abced0 <line:1:9> col:9 imported implicit used  'void (void) throw()' inline default trivial
  | `-CompoundStmt 0x1abd2e0 <col:9>
  `-CXXConstructorDecl 0x1abcfd8 <col:9> col:9 imported implicit  'void (const T &)' inline default trivial noexcept-unevaluated 0x1abcfd8
    `-ParmVarDecl 0x1abd138 <col:9> col:9 imported 'const T &'
  TypedefDecl 0x1abcc78 </tmp/first.cpp:1:1, line:3:3> col:3 imported referenced T 'struct T':'T'
  `-ElaboratedType 0x1abccd0 'struct T' sugar imported
    `-RecordType 0x1abcc50 'T' imported
      `-CXXRecord 0x1abcb38 ''

But the imported one is:

  CXXRecordDecl 0x1a51400 </tmp/first.cpp:1:9> col:9 struct definition
  |-FieldDecl 0x1a51540 <line:2:3, col:7> col:7 n 'int'
  |-CXXConstructorDecl 0x1a515e0 <line:1:9> col:9 implicit used  'void (void) throw()' inline trivial
  | `-CompoundStmt 0x1a51688 <col:9>
  `-CXXConstructorDecl 0x1a51768 <col:9> col:9 implicit  'void (const struct (anonymous at /tmp/first.cpp:1:9) &)' inline trivial noexcept-unevaluated 0x1a51768
    `-ParmVarDecl 0x1a51708 <col:9> col:9 'const struct (anonymous at /tmp/first.cpp:1:9) &'
  TypedefDecl 0x1a518b0 </tmp/first.cpp:1:1, line:3:3> col:3 T 'struct (anonymous struct at /tmp/first.cpp:1:9)':'struct (anonymous at /tmp/first.cpp:1:9)'
  `-ElaboratedType 0x1a51860 'struct (anonymous struct at /tmp/first.cpp:1:9)' sugar
    `-RecordType 0x1a514a0 'struct (anonymous at /tmp/first.cpp:1:9)'
      `-CXXRecord 0x1a51400 ''

  rC Clang


More information about the cfe-commits mailing list