From e8a2efc1b53e5c0e2d067f2e394f1438140854cc Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 13 Apr 2010 17:24:52 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158277 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/call.c | 2 +- gcc/cp/parser.c | 4 ++++ gcc/cp/pt.c | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C | 15 --------------- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C | 7 +++++++ 7 files changed, 31 insertions(+), 16 deletions(-) delete mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C 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 + + * 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 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 + + * g++.dg/cpp0x/lambda/lambda-deduce2.C: Remove. + * g++.dg/cpp0x/lambda/lambda-uneval.C: New. + 2010-04-13 Manuel López-Ibáñez * 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 -struct assert_same_type; -template -struct assert_same_type { }; - -struct A -{ - int i; -}; - -extern const int i; -assert_same_type 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 +struct A { }; +A a; // { dg-error "lambda.*unevaluated context" } + -- 2.11.0