#41 closed defect (fixed)
Duplicate function on generic specialisation
| Reported by: | Thierry Delisle | Owned by: | |
|---|---|---|---|
| Priority: | major | Component: | cfa-cc |
| Version: | 1.0 | Keywords: | generic |
| Cc: |
Description
forall( dtype T )
struct ptr_t {
T * ptr;
};
int foo( ptr_t( int ) p ) {
return 3;
}
int foo( ptr_t( float ) p ) {
return 4;
}
yields
test.c:10:1 error: duplicate function definition for foo: function
with parameters
p: instance of struct ptr_t
with parameters
float
returning
_retval_foo: Attribute with name: unused
signed int
with body
CompoundStmt
Return Statement, returning:
constant expression (4 4: signed int)
Change History (4)
comment:1 by , 8 years ago
| Priority: | blocker → major |
|---|
comment:2 by , 8 years ago
comment:4 by , 8 years ago
I managed to get this to work by following the last approach (unconditionally mangling type parameters) and adding an extra mode that never mangles type parameters (which only needed to be used in one place related to constructors). Thanks for the tips!
Note:
See TracTickets
for help on using tickets.
I looked a little closer at this, didn't manage to solve it, but here's a bit more information:
typeMode, it includes the type parameters of generic types, otherwise it does not. The Indexer call to the Mangler is not intypeMode, and putting it intotypeModebreaks other things, as does having the Mangler unconditionally mangle type parameters. This ought to be fixed, but it has non-trivial interactions with the rest of the compiler, and I have deja vu about trying to fix this before and failing.