re PR c++/67846 (ICE on code with lambda expression on x86_64-linux-gnu in check_return_expr, at cp/typeck.c:8609)

/cp
2015-11-05  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/67846
	* parser.c (cp_parser_lambda_body): Check lambda_return_type
	return value.
	* typeck2.c (cxx_incomplete_type_diagnostic): Print member or
	member function used invalidly.

/testsuite
2015-11-05  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/67846
	* g++.dg/cpp0x/lambda/lambda-ice15.C: New.

From-SVN: r229819
This commit is contained in:
Paolo Carlini 2015-11-05 16:47:40 +00:00
parent 451e8dae5d
commit 7e4756e843
5 changed files with 35 additions and 7 deletions

View file

@ -1,3 +1,11 @@
2015-11-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67846
* parser.c (cp_parser_lambda_body): Check lambda_return_type
return value.
* typeck2.c (cxx_incomplete_type_diagnostic): Print member or
member function used invalidly.
2015-11-05 Jakub Jelinek <jakub@redhat.com>
Ilya Verbin <ilya.verbin@intel.com>
@ -27,8 +35,8 @@
cp_parser_require_pragma_eol instead of cp_parser_skip_to_pragma_eol.
(cp_parser_omp_end_declare_target): Call cp_parser_require_pragma_eol
instead of cp_parser_skip_to_pragma_eol.
* decl2.c (cplus_decl_attributes): Don't diagnose block scope vars inside
declare target.
* decl2.c (cplus_decl_attributes): Don't diagnose block scope vars
inside declare target.
* pt.c (tsubst_omp_clauses): If OMP_CLAUSE_LINEAR_VARIABLE_STRIDE,
use tsubst_omp_clause_decl instead of tsubst_expr on
OMP_CLAUSE_LINEAR_STEP. Handle non-static data members in shared

View file

@ -9887,7 +9887,12 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
if (cp_parser_parse_definitely (parser))
{
if (!processing_template_decl)
apply_deduced_return_type (fco, lambda_return_type (expr));
{
tree type = lambda_return_type (expr);
apply_deduced_return_type (fco, type);
if (type == error_mark_node)
expr = error_mark_node;
}
/* Will get error here if type not deduced yet. */
finish_return_stmt (expr);

View file

@ -516,12 +516,12 @@ cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
if (DECL_FUNCTION_MEMBER_P (member)
&& ! flag_ms_extensions)
emit_diagnostic (diag_kind, input_location, 0,
"invalid use of member function "
"(did you forget the %<()%> ?)");
"invalid use of member function %qD "
"(did you forget the %<()%> ?)", member);
else
emit_diagnostic (diag_kind, input_location, 0,
"invalid use of member "
"(did you forget the %<&%> ?)");
"invalid use of member %qD "
"(did you forget the %<&%> ?)", member);
}
break;

View file

@ -1,3 +1,8 @@
2015-11-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67846
* g++.dg/cpp0x/lambda/lambda-ice15.C: New.
2015-11-05 Jakub Jelinek <jakub@redhat.com>
* c-c++-common/gomp/clauses-2.c (foo): Adjust for diagnostics

View file

@ -0,0 +1,10 @@
// PR c++/67846
// { dg-do compile { target c++11 } }
class A
{
void foo ()
{
[=] { return foo; }; // { dg-error "invalid use of member function" }
}
};