diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/tree.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr98372.C | 28 |
3 files changed, 31 insertions, 2 deletions
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index d339036..3a9a86d 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 04f039f..2c9d2f9 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<bool b> struct eif { typedef void type; }; template<> struct eif<false> {}; diff --git a/gcc/testsuite/g++.dg/template/pr98372.C b/gcc/testsuite/g++.dg/template/pr98372.C new file mode 100644 index 0000000..f1e8b0f --- /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 <typename _Tp> using remove_pointer_t = typename _Tp ::type; +template <bool> struct enable_if; +template <bool _Cond, typename> +using enable_if_t = typename enable_if<_Cond>::type; +template <typename> bool is_convertible_v; +template <typename, unsigned long = 0> class Span; +template <typename T, unsigned long> class Span { + using element_type = T; + template <unsigned long N> + Span(element_type (&arr)[N], + enable_if_t<is_convertible_v<remove_pointer_t<decltype(data(arr))>>, + decltype(nullptr)>); +}; +template <typename T> class Span<T> { + using element_type = T; + template <unsigned long N> + Span(element_type (&arr)[N], + enable_if_t<is_convertible_v<remove_pointer_t<decltype(data(arr))>>, + decltype(nullptr)>); +}; + +struct aaa +{ + Span<char> data0; +}; |