re PR c++/67846 (ICE on code with lambda expression on x86_64-linux-gnu in check_retu...
authorPaolo Carlini <paolo@gcc.gnu.org>
Thu, 5 Nov 2015 16:47:40 +0000 (16:47 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 5 Nov 2015 16:47:40 +0000 (16:47 +0000)
/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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/typeck2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice15.C [new file with mode: 0644]

index 3312dae07ea6a22206e0993f5b9bc5ddba08bcae..57de3e6b639608ef8dbd328474442167a2cdb276 100644 (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
index f26c7c335ff56750eba42c589945c549de56b91e..d439c064fe3d697cb32cd01ee3edace4d9bb6ad7 100644 (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);
index 000f5e3df42d41f71ed972352188109ec489fd1b..e73ea139a039f9f0f6967a08be8e7fb47f9b525c 100644 (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;
 
index 6cf2f4f3afbe6852b441cc4f62a234844baf0e5d..35bdfb0a5bbf240869ea7ae126f23a33cf55f620 100644 (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
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice15.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice15.C
new file mode 100644 (file)
index 0000000..7c4c18d
--- /dev/null
@@ -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" }
+  }
+};