Bug 4361 - bogus ambiguity taking the address of a member template
|
Bug#:
4361
|
Product: gcc
|
Version: 3.0.1
|
|
Host:
|
Target:
|
Build:
|
|
Status: RESOLVED
|
Severity: normal
|
Priority: P3
|
|
Resolution: FIXED
|
Assigned To: nathan@gcc.gnu.org
|
Reported By: msebor@gmail.com
|
|
Component: c++
|
Target Milestone: ---
|
|
Summary: bogus ambiguity taking the address of a member template
|
|
Keywords:
|
|
Opened: 2001-09-19 09:26
|
This is reduced from our auto_ptr testsuite. The compiler
is confused by the two conversion operators. 2.95.2 ICEs
on this code.
Regards
Martin
Release:
gcc 3.0.1
How-To-Repeat:
$ cat t.cc ; g++ t.cc
template <class T>
class auto_ptr;
template <class T>
struct auto_ptr_ref
{
template <class U>
auto_ptr_ref (auto_ptr<U>&) throw () { }
};
template<class T>
struct auto_ptr
{
template <class U>
operator auto_ptr_ref<U>() throw () {
return auto_ptr_ref<U>(*this);
}
template <class U>
operator auto_ptr<U>() throw () {
return auto_ptr<U>();
}
};
struct B { };
struct D: B { };
int main ()
{
auto_ptr<B> (auto_ptr<D>::*pf)() = &auto_ptr<D>::operator auto_ptr<B>;
}
t.cc: In function `int main()':
t.cc:32: no matches converting function `operator auto_ptr_ref<U>' to type
`struct auto_ptr<B> (struct auto_ptr<D>::*)()'
t.cc:16: candidates are: template<class U> auto_ptr::operator auto_ptr_ref<U>()
[with U = U, T = D]
State-Changed-From-To: open->analyzed
State-Changed-Why: yup, that looks bogus
Responsible-Changed-From-To: unassigned->nathan
Responsible-Changed-Why: patch in progress
State-Changed-From-To: analyzed->closed
State-Changed-Why: mainline only, as this is not a regression.
2001-12-30 Nathan Sidwell <nathan@codesourcery.com>
PR c++/4361
* cp-tree.h (CLASSTYPE_METHOD_VEC): Document where templated
conversion operators go.
(struct lang_decl_flags): Add template_conv_p and unused
bitfields.
(DECL_TEMPLATE_CONV_FN_P): New macro.
* call.c (build_user_type_conversion_1): Don't check second type
conversion of overload set first.
* class.c (add_method): Make sure templated conversion operators
all end up on slot 2.
* lex.c (do_identifier): A conversion operator token might be
satisfied by a templated conversion operator.
* mangle.c (internal_mangling_p): New global variable.
(write_template_param): Do internal mangling, if needed.
(mangle_conv_op_name_for_type): Request internal mangling.
* pt.c (check_explicit_specialization): Use
CLASSTYPE_FIRST_CONVERSION_SLOT.
(template_parm_this_level_p): New function.
(push_template_decl_real): Determine DECL_TEMPLATE_CONV_FN_P.
* search.c (lookup_fn_fields_1): Template conversions will be on
the first slot.
* typeck.c (build_component_ref): Preserve the type of an
conversion operator name on the overload type.
(build_x_function_call): Retrieve the conversion operator name.