-
Notifications
You must be signed in to change notification settings - Fork 14.6k
Closed
Labels
c++23clang:codegenIR generation bugs: mangling, exceptions, etc.IR generation bugs: mangling, exceptions, etc.debuginfo
Description
struct Foo {
template <class Self>
void func(this Self&& self) {}
};
int main() {
Foo{}.func();
}
The above will currently produce following DWARF:
DW_TAG_structure_type
DW_AT_name ("Foo")
DW_TAG_subprogram
DW_AT_name ("func<Foo>")
DW_AT_declaration (true)
DW_AT_external (true)
DW_TAG_template_type_parameter
DW_AT_type (0x0000000000000034 "Foo")
DW_AT_name ("Self")
DW_TAG_formal_parameter
DW_AT_type (0x0000000000000051 "Foo *")
DW_AT_artificial (true)
DW_TAG_formal_parameter
DW_AT_type (0x0000000000000056 "Foo &&")
NULL
NULL
DW_TAG_subprogram
DW_AT_specification (0x000000000000003a "_ZNH3Foo4funcIS_EEvOT_")
DW_TAG_formal_parameter
DW_AT_location (DW_OP_fbreg +8)
DW_AT_name ("self")
DW_AT_type (0x0000000000000056 "Foo &&")
DW_TAG_template_type_parameter
DW_AT_type (0x0000000000000034 "Foo")
DW_AT_name ("Self")
Note how the declaration of func
has 2 DW_TAG_formal_parameter
entries, one for the explicit object parameter self
and (erroneously) another for the implicit
object parameter this
. The definition only has the explicit object parameter.
Looks like CGDebugInfo::getOrCreateInstanceMethodType
would need to account for the fact that an explicit object parameter may exist, in which case we don't want to create the implicit artificial this
parameter.
Metadata
Metadata
Assignees
Labels
c++23clang:codegenIR generation bugs: mangling, exceptions, etc.IR generation bugs: mangling, exceptions, etc.debuginfo