[PR c++/84835] ICE with generic lambda in extern "C"
authorNathan Sidwell <nathan@acm.org>
Mon, 19 Mar 2018 18:56:22 +0000 (18:56 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Mon, 19 Mar 2018 18:56:22 +0000 (18:56 +0000)
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00890.html
PR c++/84835
* lambda.c (maybe_add_lambda_conv_op): Force C++ linkage.
* pt.c (build_template_decl): Propagate language linkage.

PR c++/84835
* g++.dg/cpp1y/pr84835.C: New.

From-SVN: r258655

gcc/cp/ChangeLog
gcc/cp/lambda.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/pr84835.C [new file with mode: 0644]

index 66226033e4132f3657ee6f02bf8054a1bb925570..12aaf135294c898ee8216495c96dbe9350a96975 100644 (file)
@@ -1,5 +1,9 @@
 2018-03-19  Nathan Sidwell  <nathan@acm.org>
 
+       PR c++/84835
+       * lambda.c (maybe_add_lambda_conv_op): Force C++ linkage.
+       * pt.c (build_template_decl): Propagate language linkage.
+
        PR c++/84812
        * name-lookup.c (set_local_extern_decl_linkage): Defend against
        ambiguous lookups.
index b3c75c84682086cb618ae056b8a804da064c7b44..374060626c15f3efd6d76b175b6568da6f3fe434 100644 (file)
@@ -1176,6 +1176,7 @@ maybe_add_lambda_conv_op (tree type)
   tree thistype = cp_build_qualified_type (type, TYPE_QUAL_CONST);
   tree fntype = build_method_type_directly (thistype, rettype, void_list_node);
   tree convfn = build_lang_decl (FUNCTION_DECL, name, fntype);
+  SET_DECL_LANGUAGE (convfn, lang_cplusplus);
   tree fn = convfn;
   DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
   SET_DECL_ALIGN (fn, MINIMUM_METHOD_BOUNDARY);
@@ -1208,6 +1209,7 @@ maybe_add_lambda_conv_op (tree type)
 
   name = get_identifier ("_FUN");
   tree statfn = build_lang_decl (FUNCTION_DECL, name, stattype);
+  SET_DECL_LANGUAGE (statfn, lang_cplusplus);
   fn = statfn;
   DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
   grokclassfn (type, fn, NO_SPECIAL);
index 745c9acd6eec6ddafe420156cb37c337666afa5e..fba65b4abdf74f2631aad90144d01eb91de003be 100644 (file)
@@ -4677,6 +4677,7 @@ tree
 build_template_decl (tree decl, tree parms, bool member_template_p)
 {
   tree tmpl = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), NULL_TREE);
+  SET_DECL_LANGUAGE (tmpl, DECL_LANGUAGE (decl));
   DECL_TEMPLATE_PARMS (tmpl) = parms;
   DECL_CONTEXT (tmpl) = DECL_CONTEXT (decl);
   DECL_SOURCE_LOCATION (tmpl) = DECL_SOURCE_LOCATION (decl);
index 2202df759b92bfe094e8203154d83a16a3834b69..2bc81cabd63bb8393fbaec3cea29db0bb458e65b 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-19  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/84835
+       * g++.dg/cpp1y/pr84835.C: New.
+
 2018-03-19  Sudakshina Das  <sudi.das@arm.com>
 
        PR target/81647
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr84835.C b/gcc/testsuite/g++.dg/cpp1y/pr84835.C
new file mode 100644 (file)
index 0000000..8dca3e9
--- /dev/null
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++14 } }
+// PR c++/84835
+// ICE with generic lambda inside extern "C"
+
+extern "C" 
+{
+  auto r = [] (auto x) 
+  {
+    void baz (); // extern "C"
+    baz ();
+  };
+  
+}
+
+void g ()
+{
+  r (0);
+}
+
+//  { dg-final { scan-assembler "\[^0-9\]baz" } }