aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2018-03-19 18:56:22 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2018-03-19 18:56:22 +0000
commit143f00e1126c474e7caceba74747e3173b16e87c (patch)
treecad31708fc1f804780b65574cd159ff7f364ae1e /gcc
parentf7d884d45b929c3f0ab65b0830cce4517b5f968d (diff)
downloadgcc-143f00e1126c474e7caceba74747e3173b16e87c.zip
gcc-143f00e1126c474e7caceba74747e3173b16e87c.tar.gz
gcc-143f00e1126c474e7caceba74747e3173b16e87c.tar.bz2
[PR c++/84835] ICE with generic lambda in extern "C"
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/lambda.c2
-rw-r--r--gcc/cp/pt.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr84835.C20
5 files changed, 32 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6622603..12aaf13 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index b3c75c8..3740606 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -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);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 745c9ac..fba65b4 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2202df7..2bc81ca 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..8dca3e9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr84835.C
@@ -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" } }