[cfe-dev] ASTImporter triggers assertions in some cases.
Alexey Sidorin via cfe-dev
cfe-dev at lists.llvm.org
Wed Jan 18 13:42:49 PST 2017
Looks like this is related to one of my commits. Will check tomorrow.
18.01.2017 19:05, Gaetano Checinski via cfe-dev пишет:
> The following test fails on my machine:
>
> > // svn: E155007
> > // unittests/AST/ASTImporterTest.cpp
> > TEST(ImportExpr, ImportIOstream) {
> > MatchVerifier<Decl> Verifier;
> > EXPECT_TRUE(testImport(
> > "#include<iostream> \n"
> > "inline namespace D {\n"
> > " template<class>\n"
> > " struct declToImport {};\n"
> > "}\n", Lang_CXX, "", Lang_CXX, Verifier, decl()));
> > }
>
> It seems that the astImporter is not completely deterministic.
> In anycase, I encounter one of two errors:
> 1) If it calls `TagDecl::setTypedefDeclForAnonDecl` it fails as
> `assert(T->isLinkageValid());` is false
> 2) If it parses a FriendDecl it gets stuck in an infinite loop :
>
> Decl *ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {
> /*......*/
> │3437 while (ImportedFriend) {
> │3438 if (D->getFriendDecl() &&
> ImportedFriend->getFriendDecl()) {
> // ^^^ evaluates to false
> │3439 if (Context.IsStructurallyEquivalent(D->getFriendDecl(),
> │3440 ImportedFriend->getFriendDecl()))
> │3441 return Importer.Imported(D, ImportedFriend);
> │3442
> │3443 } else if (D->getFriendType() &&
> ImportedFriend->getFriendType()) {
> │3444 if (Importer.IsStructurallyEquivalent(
> // ^^^ always false
> │3445 D->getFriendType()->getType(),
> │3446 ImportedFriend->getFriendType()->getType(), true))
> │3447 return Importer.Imported(D, ImportedFriend);
> │3448 }
> │3449 ImportedFriend = ImportedFriend->getNextFriend();
> // ^^^ returns always the same frienddecl;
> // why does a Frienddecl has itself as a friend ?
> │3450 }
>
> Does anybody have an idea what's going on?
>
>
>
>
> 2017-01-09 13:49 GMT+00:00 Gaetano Checinski
> <gaetano.checinski at gmail.com <mailto:gaetano.checinski at gmail.com>>:
>
> Hi Guys,
> I've noticed that the ASTImporter fails to import some named decls
> from <iostream> due to an invalid linkagecache
> (in TagDecl::setTypedefNameForAnonDecl()).
> Running with assertions disabled never terminates.
> However, while trying to build an minimal reproducible example, i
> stumbled on a different error regarding templated structs with
> frienddecls.
> I think they may be related because i found this commit:
> https://public.cdl.uni-saarland.de/noise/clang/commit/ad0e27b18b0cefab049121d4bfd7b12216e7de6e
> <https://mailtrack.io/trace/link/3bfa5f729eac3d7d441cda522b04d9aa06778eec?url=https%3A%2F%2Fpublic.cdl.uni-saarland.de%2Fnoise%2Fclang%2Fcommit%2Fad0e27b18b0cefab049121d4bfd7b12216e7de6e&signature=1e3968956e628307>
>
>
> The following test fails:
> > // svn: E155007
> > // unittests/AST/ASTImporterTest.cpp
> > TEST(ImportExpr, TemplatedStructFriend) {
> > MatchVerifier<Decl> Verifier;
> > EXPECT_TRUE(testImport(
> > "void foo() {}; \n"
> > "inline namespace D {\n"
> > " template<class>\n"
> > " struct declToImport {\n"
> > " friend bool f(const declToImport &);\n"
> > " };\n"
> > " template class declToImport<int>;\n"
> > "}\n", Lang_CXX, "", Lang_CXX, Verifier, decl()));
> > }
>
> stacktrace:
> > clang/llvm/tools/clang/lib/AST/DeclFriend.cpp, line 43.
> > 0 ASTTests 0x0000000104f8e135 l
> > lvm::sys::PrintStackTrace(llvm::raw_ostream&) + 101
> > 1 ASTTests 0x0000000104f8e779
> PrintStackTraceSignalHandler(void*) + 25
> > 2 ASTTests 0x0000000104f8a6d9
> llvm::sys::RunSignalHandlers() + 425
> > 3 ASTTests 0x0000000104f8ec92
> SignalHandler(int) + 354
> > 4 libsystem_platform.dylib 0x00007fff9e3eebba _sigtramp + 26
>
> Thanks in advance,
> Gaetano Checinski
>
>
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170119/4f3c1fb8/attachment.html>
More information about the cfe-dev
mailing list