This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [12/12] Simplify uses of hash_map
- From: Mikhail Maltsev <maltsevm at gmail dot com>
- To: Rainer Orth <ro at CeBiTec dot Uni-Bielefeld dot DE>, Jeff Law <law at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org, richard dot sandiford at arm dot com
- Date: Fri, 26 Jun 2015 19:15:54 +0300
- Subject: Re: [12/12] Simplify uses of hash_map
- Authentication-results: sourceware.org; auth=none
- References: <87egl2bicm dot fsf at e105548-lin dot cambridge dot arm dot com> <87twty8ob7 dot fsf at e105548-lin dot cambridge dot arm dot com> <558C3091 dot 5050607 at redhat dot com> <ydd4mlutwsq dot fsf at lokon dot CeBiTec dot Uni-Bielefeld dot DE>
On 06/26/2015 04:37 PM, Rainer Orth wrote:
> /vol/gcc/src/hg/trunk/local/gcc/hash-map.h:173:8: note: template<class Arg, bool (* f)(tree_node*&, tree_node* const&, Arg)> void hash_map::traverse(Arg) const [with Arg = Arg; bool (* f)(typename Traits::key_type&, const Value&, Arg) = f; KeyId = tree_node*; Value = tree_node*; Traits = simple_hashmap_traits<default_hash_traits<tree_node*> >]
> /vol/gcc/src/hg/trunk/local/gcc/hash-map.h:173:8: note: template argument deduction/substitution failed:
> /vol/gcc/src/hg/trunk/local/gcc/c-family/cilk.c:747:76: error: could not convert template argument 'fill_decls_vec' to 'bool (*)(tree_node*&, tree_node* const&, auto_vec<cilk_decls>*)'
> In file included from /vol/gcc/src/hg/trunk/local/gcc/hash-table.h:553:0,
> from /vol/gcc/src/hg/trunk/local/gcc/coretypes.h:317,
> from /vol/gcc/src/hg/trunk/local/gcc/c-family/cilk.c:25:
> /vol/gcc/src/hg/trunk/local/gcc/hash-map.h:181:8: note: template<class Arg, bool (* f)(tree_node*&, tree_node**, Arg)> void hash_map::traverse(Arg) const [with Arg = Arg; bool (* f)(typename Traits::key_type&, Value*, Arg) = f; KeyId = tree_node*; Value = tree_node*; Traits = simple_hashmap_traits<default_hash_traits<tree_node*> >]
> /vol/gcc/src/hg/trunk/local/gcc/hash-map.h:181:8: note: template argument deduction/substitution failed:
> /vol/gcc/src/hg/trunk/local/gcc/c-family/cilk.c:747:76: error: could not convert template argument 'fill_decls_vec' to 'bool (*)(tree_node*&, tree_node**, auto_vec<cilk_decls>*)'
> make: *** [c-family/cilk.o] Error 1
>
> Rainer
>
It seems that I can also reproduce this issue. The following code was
reduced from GCC r224910, genmatch.c:
$ cat ./test2.ii
template <typename Descriptor, template <typename> class> class hash_table {
typedef typename Descriptor::value_type value_type;
template <typename Argument, int (*)(value_type *, Argument)>
void traverse(Argument);
};
template <typename Descriptor, template <typename> class Allocator>
template <
typename Argument,
int (*)(typename hash_table<Descriptor, Allocator>::value_type *,
Argument)>
void hash_table<Descriptor, Allocator>::traverse(Argument) {}
It is accepted by current GCC and Clang but rejected by EDG:
$ /opt/intel/bin/icpc -V
Intel(R) C++ Intel(R) 64 Compiler XE for applications running on
Intel(R) 64, Version 15.0.3.187 Build 20150407
Copyright (C) 1985-2015 Intel Corporation. All rights reserved.
FOR NON-COMMERCIAL USE ONLY
$ /opt/intel/bin/icpc -c ./test2.ii
./test2.ii(11): error: declaration is incompatible with function
template "void hash_table<Descriptor,
<unnamed>>::traverse<Argument,<unnamed>>(Argument)" (declared at line 4)
void hash_table<Descriptor, Allocator>::traverse(Argument) {}
^
compilation aborted for ./test2.ii (code 2)
--
Regards,
Mikhail Maltsev