[llvm-bugs] [Bug 31405] New: Itanium ABI: debug assertion in template mangling with declype return

via llvm-bugs llvm-bugs at lists.llvm.org
Fri Dec 16 02:20:37 PST 2016


https://llvm.org/bugs/show_bug.cgi?id=31405

            Bug ID: 31405
           Summary: Itanium ABI: debug assertion in template mangling with
                    declype return
           Product: clang
           Version: 3.9
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++14
          Assignee: unassignedclangbugs at nondot.org
          Reporter: spreis at yandex-team.ru
                CC: llvm-bugs at lists.llvm.org
    Classification: Unclassified

I develop in-house source code indexer and met the following issue.
The simple declaration cannot be mangled - Itanium mangler fails with assert if
clang is built in debug mode:

>> cat test.cpp
template <typename T> auto foo(T x) -> const decltype(x);

>> indexer -std=c++14 test.cpp

indexer: /home/spreis/LLVM/llvm/tools/clang/lib/AST/ItaniumMangle.cpp:3976:
void (anonymous namespace)::CXXNameMangler::mangleFunctionParam(const
clang::ParmVarDecl *): Assertion `parmDepth < FunctionTypeDepth.getDepth()'
failed.
Aborted (core dumped)

The problem is that both parts of comparison are '0'. This is due to the fact
that in this case CXXNameMangler::mangleFunctionParam() is called transitively
from CXXNameMangler::makeFunctionReturnTypeTags() (see stack trace below) and
for TrackReturnTypeTags mangler the FunctionTypeDepth is never increased in
this case. I believe this is incorrect: makeFunctionReturnTypeTags is called in
context of return value, so its FunctionTypeDepth should be 1 at minimum
(though I am not 100% sure: I am still new to clang).

The patch below fixes the issue for me:

~/LLVM/llvm/tools/clang/lib/AST$ svn diff
Index: ItaniumMangle.cpp
===================================================================
--- ItaniumMangle.cpp   (revision 289930)
+++ ItaniumMangle.cpp   (working copy)
@@ -4418,9 +4418,12 @@

   const FunctionProtoType *Proto =
       cast<FunctionProtoType>(FD->getType()->getAs<FunctionType>());

+  FunctionTypeDepthState saved = TrackReturnTypeTags.FunctionTypeDepth.push();
   TrackReturnTypeTags.FunctionTypeDepth.enterResultType();
   TrackReturnTypeTags.mangleType(Proto->getReturnType());
   TrackReturnTypeTags.FunctionTypeDepth.leaveResultType();
+  TrackReturnTypeTags.FunctionTypeDepth.pop(saved);

   return TrackReturnTypeTags.AbiTagsRoot.getSortedUniqueUsedAbiTags();
 }

Unfortunately I cannot provide full reproducer. I may try to create skeleton
visitor as reduced test case at later days. But maybe some C++ mangler capable
of handling this case already exists (c-index-test tool's mangling doesn't work
for function templates) - it should crash on debug CLANG with the declaration
above.

----   The stack trace: -------------------


>> gdb --args indexer -std=c++14 test.cpp
[...]
(gdb) run

indexer: /home/spreis/LLVM/llvm/tools/clang/lib/AST/ItaniumMangle.cpp:3976:
void (anonymous namespace)::CXXNameMangler::mangleFunctionParam(const
clang::ParmVarDecl *): Assertion `parmDepth < FunctionTypeDepth.getDepth()'
failed.

(gdb) bt
Program received signal SIGABRT, Aborted.
0x00007ffff69b8c37 in __GI_raise (sig=sig at entry=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56      ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

(gdb) bt

#0  0x00007ffff69b8c37 in __GI_raise (sig=sig at entry=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff69bc028 in __GI_abort () at abort.c:89
#2  0x00007ffff69b1bf6 in __assert_fail_base () at assert.c:92
#3  0x00007ffff69b1ca2 in __GI___assert_fail () at assert.c:101
#4  0x0000000000e3600d in (anonymous
namespace)::CXXNameMangler::mangleFunctionParam ()
    at /home/spreis/LLVM/llvm/tools/clang/lib/AST/ItaniumMangle.cpp:3976
#5  0x0000000000e2c9a2 in mangleType ()
    at /home/spreis/LLVM/llvm/tools/clang/lib/AST/ItaniumMangle.cpp:3028
#6  (anonymous namespace)::CXXNameMangler::mangleType ()
    at /home/spreis/LLVM/llvm/tools/clang/include/clang/AST/TypeNodes.def:88
#7  0x0000000000e2bf95 in (anonymous namespace)::CXXNameMangler::mangleType ()
    at /home/spreis/LLVM/llvm/tools/clang/lib/AST/ItaniumMangle.cpp:2252
#8  0x0000000000e2aa0f in makeFunctionReturnTypeTags ()  <<<<<<!!!!!!!!!
    at /home/spreis/LLVM/llvm/tools/clang/lib/AST/ItaniumMangle.cpp:4424
#9  (anonymous namespace)::CXXNameMangler::mangleFunctionEncoding () 
    at /home/spreis/LLVM/llvm/tools/clang/lib/AST/ItaniumMangle.cpp:652
#10 0x0000000000e28901 in (anonymous
namespace)::ItaniumMangleContextImpl::mangleCXXName ()
    at /home/spreis/LLVM/llvm/tools/clang/lib/AST/ItaniumMangle.cpp:4476
#11 0x000000000058fff0 in Collector::getMangledName ()
    at /home/spreis/work/indexer/collector.cpp:914
#12 0x000000000058d2f0 in Collector::registerFunctionDecl ()
    at /home/spreis/work/indexer/collector.cpp:640
#13 0x00000000005853c8 in BrowserASTVisitor::VisitFunctionDecl ()
    at /home/spreis/work/indexer/browserastvisitor.h:125
#14 0x0000000000573754 in WalkUpFromFunctionDecl ()
    at /home/spreis/include/clang/AST/DeclNodes.inc:371
#15 TraverseFunctionDecl (D=0x1c8acd0, this=<optimized out>)
    at /home/spreis/LLVM/build/include/clang/AST/RecursiveASTVisitor.h:1883
#16 clang::RecursiveASTVisitor<BrowserASTVisitor>::TraverseDecl () 
    at /place/home/spreis/LLVM/build/include/clang/AST/DeclNodes.inc:371
#17 0x00000000005736e2 in BrowserASTVisitor::TraverseDecl ()
    at     at /home/spreis/work/indexer/browserastvisitor.h:324
#18 0x0000000000574d5b in
clang::RecursiveASTVisitor<BrowserASTVisitor>::TraverseFunctionTemplateDecl ()
    at /home/spreis/LLVM/build/include/clang/AST/RecursiveASTVisitor.h:1637
....

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20161216/c678f91d/attachment-0001.html>


More information about the llvm-bugs mailing list