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