https://bugs.llvm.org/show_bug.cgi?id=32679
Bug ID: 32679
Summary: [Windows]Clang Coverage attempts to mangle name of not
fully instantiated class template function
Product: new-bugs
Version: unspecified
Hardware: PC
OS: Windows NT
Status: NEW
Severity: enhancement
Priority: P
Component: new bugs
Assignee: [email protected]
Reporter: [email protected]
CC: [email protected]
Created attachment 18293
--> https://bugs.llvm.org/attachment.cgi?id=18293&action=edit
My patch to solve this issue, source code and build script
Clang Coverage reports an error when trying to mangle name of not fully
instantiated class template function on Windows.
>From the code below, Clang tries to create mangled name of the function "Max".
Sample code:
“
template <typename T, bool has_infinity>
struct RangeBase;
template<typename T>
struct RangeBase<T, true>
{
static constexpr T Min()
{
return -1;
}
static constexpr T Max()
{
return -1;
}
};
int main()
{
//if uncommented then compiles properly
//RangeBase<float, true>::Max();
RangeBase<float, true>::Min();
return 0;
}
“
Compilation Command:
clang++ -cc1 -triple i686-pc-windows-msvc19.0.0 -emit-obj
-fprofile-instrument=clang -O0 -std=c++14 -fdelayed-template-parsing
-fcoverage-mapping -o "bug1.obj" bug1.cpp
Error message after compilation:
error: cannot mangle this template type parameter type yet
1>CL : error : cannot mangle this template type parameter type yet
1>bug1.cpp(12,2): error : cannot mangle this template type parameter type yet
1> static constexpr T Max()
1> ^~~~~~~~~~~~~~~~~~~~~~~~
It look like the problem starts in file ModuleBuilder.cpp in function
HandleInlineFunctionDefinition.
This function calls AddDeferredUnusedCoverageMapping which adds function "Max"
to the DenseMap DeferredEmptyCoverageMappingDecls.
Later there is an attempt to mangle name of this partially instantiated
function.
I suppose name of this function shouldn’t be mangled. It shouldn't even be in
this Map.
I have created simple patch: bug1Patch.patch (in attachment). It should solve
this issue.
My simple Patch (also in attachment):
Index: ModuleBuilder.cpp
===================================================================
--- ModuleBuilder.cpp (revision 300404)
+++ ModuleBuilder.cpp (working copy)
@@ -197,7 +197,9 @@
// Provide some coverage mapping even for methods that aren't emitted.
// Don't do this for templated classes though, as they may not be
// instantiable.
- if (!MD->getParent()->getDescribedClassTemplate())
+ const CXXRecordDecl *RD = MD->getParent();
+ if (!RD->getDescribedClassTemplate() &&
+ !isa<ClassTemplatePartialSpecializationDecl>(RD))
Builder->AddDeferredUnusedCoverageMapping(MD);
}
--
You are receiving this mail because:
You are on the CC list for the bug._______________________________________________
llvm-bugs mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs