diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 27 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C | 7 |
6 files changed, 48 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 26926ce..42c0e9f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2010-02-09 Jason Merrill <jason@redhat.com> + + PR c++/42370 + * decl2.c (change_return_type): New fn. + * semantics.c (apply_lambda_return_type): Use it. + * cp-tree.h: Declare it. + 2010-02-05 Richard Guenther <rguenther@suse.de> * Make-lang.in (cp/cp-lang.o): Depend on gt-cp-cp-lang.h. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 2f925e1..27c820b 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4732,6 +4732,7 @@ extern tree cxx_maybe_build_cleanup (tree); /* in decl2.c */ extern bool check_java_method (tree); extern tree build_memfn_type (tree, tree, cp_cv_quals); +extern tree change_return_type (tree, tree); extern void maybe_retrofit_in_chrg (tree); extern void maybe_make_one_only (tree); extern bool vague_linkage_fn_p (tree); diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 2b284fb..c5b6e87 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -139,6 +139,33 @@ build_memfn_type (tree fntype, tree ctype, cp_cv_quals quals) return fntype; } +/* Return a variant of FNTYPE, a FUNCTION_TYPE or METHOD_TYPE, with its + return type changed to NEW_RET. */ + +tree +change_return_type (tree new_ret, tree fntype) +{ + tree newtype; + tree args = TYPE_ARG_TYPES (fntype); + tree raises = TYPE_RAISES_EXCEPTIONS (fntype); + tree attrs = TYPE_ATTRIBUTES (fntype); + + if (same_type_p (new_ret, TREE_TYPE (fntype))) + return fntype; + + if (TREE_CODE (fntype) == FUNCTION_TYPE) + newtype = build_function_type (new_ret, args); + else + newtype = build_method_type_directly (TYPE_METHOD_BASETYPE (fntype), + new_ret, TREE_CHAIN (args)); + if (raises) + newtype = build_exception_variant (newtype, raises); + if (attrs) + newtype = cp_build_type_attribute_variant (newtype, attrs); + + return newtype; +} + /* Build a PARM_DECL with NAME and TYPE, and set DECL_ARG_TYPE appropriately. */ diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 441081c..39085be 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5584,7 +5584,7 @@ apply_lambda_return_type (tree lambda, tree return_type) /* TREE_TYPE (FUNCTION_DECL) == METHOD_TYPE TREE_TYPE (METHOD_TYPE) == return-type */ - TREE_TYPE (TREE_TYPE (fco)) = return_type; + TREE_TYPE (fco) = change_return_type (return_type, TREE_TYPE (fco)); result = DECL_RESULT (fco); if (result == NULL_TREE) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4dd6762..b91829c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-02-09 Jason Merrill <jason@redhat.com> + + PR c++/42370 + * g++.dg/cpp0x/lambda/lambda-warn2.C: New. + 2010-02-09 Tobias Burnus <burnus@net-b.de> PR fortran/41869 diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C new file mode 100644 index 0000000..ce5e7c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C @@ -0,0 +1,7 @@ +// PR c++/42370 +// { dg-options "-std=c++0x -Wall" } + +void foo() +{ + []{ return 0; }(); +} // { dg-bogus "no return statement" } |