summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/cp/parser.c4
-rw-r--r--gcc/cp/pt.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C7
7 files changed, 31 insertions, 16 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0bb6cbb2c74..d6be4b47734 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2010-04-13 Jason Merrill <jason@redhat.com>
+
+ * call.c (type_decays_to): Check MAYBE_CLASS_TYPE_P instead of
+ CLASS_TYPE_P.
+ * parser.c (cp_parser_lambda_expression): Complain about lambda in
+ unevaluated context.
+ * pt.c (iterative_hash_template_arg): Don't crash on lambda.
+
2010-04-12 Jason Merrill <jason@redhat.com>
PR c++/43641
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 1ed320cc03a..90f84e020ae 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -2263,7 +2263,7 @@ type_decays_to (tree type)
return build_pointer_type (TREE_TYPE (type));
if (TREE_CODE (type) == FUNCTION_TYPE)
return build_pointer_type (type);
- if (!CLASS_TYPE_P (type))
+ if (!MAYBE_CLASS_TYPE_P (type))
type = cv_unqualified (type);
return type;
}
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index e25c280f486..e41a6d7850c 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -7081,6 +7081,10 @@ cp_parser_lambda_expression (cp_parser* parser)
LAMBDA_EXPR_LOCATION (lambda_expr)
= cp_lexer_peek_token (parser->lexer)->location;
+ if (cp_unevaluated_operand)
+ error_at (LAMBDA_EXPR_LOCATION (lambda_expr),
+ "lambda-expression in unevaluated context");
+
/* We may be in the middle of deferred access check. Disable
it now. */
push_deferring_access_checks (dk_no_deferred);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 367608fb908..29489b6337c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -1563,6 +1563,12 @@ iterative_hash_template_arg (tree arg, hashval_t val)
val = iterative_hash_template_arg (TREE_TYPE (arg), val);
return iterative_hash_template_arg (TYPE_DOMAIN (arg), val);
+ case LAMBDA_EXPR:
+ /* A lambda can't appear in a template arg, but don't crash on
+ erroneous input. */
+ gcc_assert (errorcount > 0);
+ return val;
+
default:
switch (tclass)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dcc08f501e0..04274bad79c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-13 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp0x/lambda/lambda-deduce2.C: Remove.
+ * g++.dg/cpp0x/lambda/lambda-uneval.C: New.
+
2010-04-13 Manuel López-Ibáñez <manu@gcc.gnu.org>
* gcc.dg/cpp/cpp.exp: Test also c-c++-common/cpp.
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C
deleted file mode 100644
index e92f6f2752c..00000000000
--- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C
+++ /dev/null
@@ -1,15 +0,0 @@
-// Test that cv-quals are dropped from non-class return type
-// { dg-options "-std=c++0x" }
-
-template <class T, class U>
-struct assert_same_type;
-template <class T>
-struct assert_same_type<T,T> { };
-
-struct A
-{
- int i;
-};
-
-extern const int i;
-assert_same_type <decltype ([]{ return i; }()), int> x;
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C
new file mode 100644
index 00000000000..33ba7b0a436
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C
@@ -0,0 +1,7 @@
+// 5.1.2/2: A lambda-expression shall not appear in an unevaluated operand.
+// { dg-options "-std=c++0x" }
+
+template <class T>
+struct A { };
+A<decltype([]{ return 1; }())> a; // { dg-error "lambda.*unevaluated context" }
+