n Thu, Apr 7, 2011 at 2:32 PM, Jason Merrill <ja...@redhat.com> wrote:
> People have been finding other places where we haven't been handling SFINAE
> properly.  In many cases, there are two patches for each fix; the first one
> fixes the bug conservatively (for possible application to 4.6), and the
> second one reorganizes things to be cleaner.
>
> Tested x86_64-pc-linux-gnu, applying to trunk.
>



>
> commit 9690fccd312c95916260a0ba5f07e397af811b37
> Author: Jason Merrill <ja...@redhat.com>
> Date:   Tue Apr 5 22:02:35 2011 -0400
>
>        PR c++/48452
>        * typeck.c (build_x_compound_expr_from_list): Return error_mark_node
>        in SFINAE context.
>
> diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
> index 8e3796e..ecd7d41 100644
> --- a/gcc/cp/typeck.c
> +++ b/gcc/cp/typeck.c
> @@ -5472,6 +5472,8 @@ build_x_compound_expr_from_list (tree list,
> expr_list_kind exp,
>          default:
>            gcc_unreachable ();
>          }
> +      else
> +       return error_mark_node;
>
>       for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
>        expr = build_x_compound_expr (expr, TREE_VALUE (list),
> diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae10.C
> b/gcc/testsuite/g++.dg/cpp0x/sfinae10.C
> new file mode 100644
> index 0000000..ede8b70
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae10.C
> @@ -0,0 +1,18 @@
> +// PR c++/48452
> +// { dg-options -std=c++0x }
> +namespace std {
> +  template <class T> T&& declval();
> +}
> +
> +template<class T, class... Args>
> +decltype(T(std::declval<Args>()...), char()) f(int);
> +
> +template<class, class...>
> +char (&f(...))[2];
> +
> +struct A { virtual ~A() = 0; };
> +struct B {};
> +
> +static_assert(sizeof(f<A, int, int>(0)) != 1, "Error"); // a
> +static_assert(sizeof(f<B, void, int>(0)) != 1, "Error"); // b
> +static_assert(sizeof(f<void, int, int>(0)) != 1, "Error"); // c
>

This caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48528

-- 
H.J.

Reply via email to