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:
parent
bf7292fcee
commit
8e519a8b0a
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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" }
|
Loading…
Reference in New Issue