diff options
author | Jason Merrill <jason@redhat.com> | 2010-04-13 13:24:52 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2010-04-13 13:24:52 -0400 |
commit | 44b2dc6ca39c88648a5e173a5be450b3b0ca4f69 (patch) | |
tree | 977b0cff78060a6f7983494f751b2ac5b4fbd765 /gcc | |
parent | 4867a0c6f8bc1a070e0a9a8613666246e9fdc6b8 (diff) | |
download | gcc-44b2dc6ca39c88648a5e173a5be450b3b0ca4f69.zip gcc-44b2dc6ca39c88648a5e173a5be450b3b0ca4f69.tar.gz gcc-44b2dc6ca39c88648a5e173a5be450b3b0ca4f69.tar.bz2 |
call.c (type_decays_to): Check MAYBE_CLASS_TYPE_P instead of CLASS_TYPE_P.
* 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.
From-SVN: r158277
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/call.c | 2 | ||||
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C | 7 |
7 files changed, 31 insertions, 16 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0bb6cbb..d6be4b4 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 1ed320c..90f84e0 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 e25c280..e41a6d7 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 367608f..29489b6 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 dcc08f5..04274ba 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 e92f6f2..0000000 --- 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 0000000..33ba7b0 --- /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" } + |