re PR c++/56039 (ICE in iterative_hash_template_arg, at cp/pt.c:1606)

PR c++/56039
	* tree.c (strip_typedefs_expr): Complain about lambda, don't abort.

From-SVN: r196741
This commit is contained in:
Jason Merrill 2013-03-16 22:38:35 -04:00 committed by Jason Merrill
parent bf7292fcee
commit 8e519a8b0a
3 changed files with 60 additions and 1 deletions

View File

@ -1,5 +1,8 @@
2013-03-16 Jason Merrill <jason@redhat.com>
PR c++/56039
* tree.c (strip_typedefs_expr): Complain about lambda, don't abort.
PR c++/54359
* parser.c (cp_parser_direct_declarator): Fix late return
for out-of-class defn of member function.

View File

@ -1421,7 +1421,8 @@ strip_typedefs_expr (tree t)
}
case LAMBDA_EXPR:
gcc_unreachable ();
error ("lambda-expression in a constant expression");
return error_mark_node;
default:
break;

View File

@ -0,0 +1,55 @@
// PR c++/56039
// { dg-do compile { target c++11 } }
template <bool> struct BoolSink { typedef void type; };
template <typename T, typename U>
struct AddRvalueReferenceImpl { typedef T type; };
template <typename T>
struct AddRvalueReferenceImpl<T, typename BoolSink<false &&
[] {
extern T &&tref;
}>::type> { // { dg-error "lambda" }
typedef T &&type;
};
template <typename T>
struct AddRvalueReference : AddRvalueReferenceImpl<T, void> { };
namespace ImplHelpers {
template <typename T>
typename AddRvalueReference<T>::type create(void) { }
}
template <typename T, typename U, typename ...Args>
struct IsConstructibleImpl { enum { value = 0 }; };
template <typename T, typename ...Args>
struct IsConstructibleImpl<T, typename BoolSink<false &&
[] {
T t( ::ImplHelpers::create<Args>() ...);
}>::type, Args ...> { // { dg-error "lambda" }
enum { value = 1 };
};
template <typename T, typename ...Args>
struct IsConstructible : IsConstructibleImpl<T, void, Args ...> { };
struct DestroyMe {
~DestroyMe() = delete;
};
static_assert(+IsConstructible<int>::value, "error");
static_assert(!IsConstructible<void>::value, "error");
static_assert(+IsConstructible<int [1]>::value, "error");
static_assert(!IsConstructible<DestroyMe>::value, "error");
static_assert(!IsConstructible<int *, char *>::value, "error");
static_assert(+IsConstructible<int &&, int>::value, "error");
static_assert(!IsConstructible<int &&, int &>::value, "error");
static_assert(+IsConstructible<int &&, int &&>::value, "error");
// { dg-prune-output "expected" }
// { dg-prune-output "does not name a class" }
// { dg-prune-output "static assertion" }