Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[dsymutil] Fix template stripping in getDIENames(...) to account for …
…overloaded operators Currently dsymutil when generating accelerator tables will attempt to strip the template parameters from names for subroutines. For some overload operators which contain < in their names e.g. operator< the current method ends up stripping the operator name as well, we just end up with the name operator in the table for each case. Differential Revision: https://reviews.llvm.org/D75545
- Loading branch information
Showing
4 changed files
with
96 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file added
BIN
+9.42 KB
llvm/test/tools/dsymutil/Inputs/private/tmp/templated_operators/template_operators
Binary file not shown.
Binary file added
BIN
+4.58 KB
llvm/test/tools/dsymutil/Inputs/private/tmp/templated_operators/template_operators.o
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
RUN: dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/private/tmp/templated_operators/template_operators -o %t.apple.dSYM | ||
|
||
RUN: llvm-dwarfdump -apple-names %t.apple.dSYM | FileCheck %s -check-prefix=NAMES | ||
|
||
The test was compiled from a single source: | ||
$ cat template_operators.cpp | ||
template <typename T> | ||
bool operator<(const T&, const T&){ | ||
return true; | ||
} | ||
|
||
template <typename T> | ||
bool operator>(const T&, const T&){ | ||
return true; | ||
} | ||
|
||
template <typename T> | ||
bool operator<<(const T&, const T&){ | ||
return true; | ||
} | ||
|
||
template <typename T> | ||
bool operator>>(const T&, const T&){ | ||
return true; | ||
} | ||
|
||
template <typename T> | ||
bool operator==(const T&, const T&){ | ||
return true; | ||
} | ||
|
||
struct B{}; | ||
|
||
struct D{}; | ||
|
||
template <typename T> | ||
bool operator<=>(const T&,const T&){ return true;} | ||
|
||
int main() { | ||
B b1; | ||
B b2; | ||
D d1; | ||
D d2; | ||
|
||
return b1 < b2 && b1 > b2 && b1 << b2 && b1 >> b2 && b1 == b2 && d1 <=> d2; | ||
} | ||
$ clang++ -std=c++2a -g template_operators.cpp -c -o template_operators.o | ||
$ clang template_operators.o -o template_operators | ||
|
||
|
||
NAMES-DAG: "operator<" | ||
NAMES-DAG: "operator<<B>" | ||
NAMES-DAG: "operator>" | ||
NAMES-DAG: "operator><B>" | ||
NAMES-DAG: "operator<<" | ||
NAMES-DAG: "operator<<<B>" | ||
NAMES-DAG: "operator>>" | ||
NAMES-DAG: "operator>><B>" | ||
NAMES-DAG: "operator<=>" | ||
NAMES-DAG: "operator<=><D>" | ||
NAMES-DAG: "operator==" | ||
NAMES-DAG: "operator==<B>" |