[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.
Hi,
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 ''
Repository:
rC Clang
https://reviews.llvm.org/D44079
More information about the cfe-commits
mailing list