diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index d339036e88e..3a9a86de34a 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -3841,8 +3841,8 @@ cp_tree_equal (tree t1, tree t2) /* Module duplicate checking can have t1 = new, t2 = existing, and they should be considered matching at this point. */ - && (DECL_CONTEXT (t1) != map_context_from - && DECL_CONTEXT (t2) != map_context_to)) + && !(DECL_CONTEXT (t1) == map_context_from + && DECL_CONTEXT (t2) == map_context_to)) /* When comparing hash table entries, only an exact match is good enough; we don't want to replace 'this' with the version from another function. But be more flexible diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C index 04f039fac43..2c9d2f9b329 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C @@ -1,5 +1,6 @@ // PR c++/52830 // { dg-do compile { target c++11 } } +// { dg-ice "comptypes" } template struct eif { typedef void type; }; template<> struct eif {}; diff --git a/gcc/testsuite/g++.dg/template/pr98372.C b/gcc/testsuite/g++.dg/template/pr98372.C new file mode 100644 index 00000000000..f1e8b0f3323 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr98372.C @@ -0,0 +1,28 @@ +// PR 98372 ICE due to incorrect type compare +// { dg-do compile { target c++11 } } + +template using remove_pointer_t = typename _Tp ::type; +template struct enable_if; +template +using enable_if_t = typename enable_if<_Cond>::type; +template bool is_convertible_v; +template class Span; +template class Span { + using element_type = T; + template + Span(element_type (&arr)[N], + enable_if_t>, + decltype(nullptr)>); +}; +template class Span { + using element_type = T; + template + Span(element_type (&arr)[N], + enable_if_t>, + decltype(nullptr)>); +}; + +struct aaa +{ + Span data0; +};