aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2016-12-12 17:00:37 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2016-12-12 17:00:37 +0000
commit8e09a726e62c6ade9ea25e1f1a9269141ce73e81 (patch)
tree5ef5a0b7cfb58687079b847ea9b92a24032c250c /gcc
parentb8cab8a5492e9639fc9f0ff23f5c392ac395e8a2 (diff)
downloadgcc-8e09a726e62c6ade9ea25e1f1a9269141ce73e81.zip
gcc-8e09a726e62c6ade9ea25e1f1a9269141ce73e81.tar.gz
gcc-8e09a726e62c6ade9ea25e1f1a9269141ce73e81.tar.bz2
re PR other/78252 (C++ demangler crashes with infinite recursion with lambda (auto))
libiberty/ PR c++/78252 * cp-demangle.c (struct d_print_info): Add is_lambda_arg field. (d_print_init): Initialize it. (d_print_comp_inner) <DEMANGLE_COMPONENT_TEMPLATE_PARAM>: Check is_lambda_arg for auto. <DEMANGLE_COMPONENT_REFERENCE, DEMANGLE_COMPONENT_RVALUE_REFERENCE>: Skip smashing check when is_lambda_arg. <DEMANGLE_COMPONENT_LAMBDA>: Increment is_lambda_arg around arg printing. * testsuite/demangle-expected: Add lambda auto mangling cases. gcc/testsuite/ PR c++/78252 * g++.dg/cpp1y/lambda-mangle-1.C: New. From-SVN: r243566
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-mangle-1.C88
2 files changed, 93 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5105869..982a203 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-12-12 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/78252
+ * g++.dg/cpp1y/lambda-mangle-1.C: New.
+
2016-12-12 Uros Bizjak <ubizjak@gmail.com>
PR target/78738
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-mangle-1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-mangle-1.C
new file mode 100644
index 0000000..ca0910b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/lambda-mangle-1.C
@@ -0,0 +1,88 @@
+// { dg-do compile { target c++14 } }
+
+// PRs 78621
+
+// We erroneously mangled lambda auto parms as-if template parameters (T<n>_),
+// rather than auto (Da). Fixed in abi version 11
+
+template<typename T> class X;
+
+template<typename T>
+T &&forward (T &v)
+{
+ return static_cast<T &&> (v);
+}
+
+template<typename T>
+void eat (T &v)
+{
+}
+
+template<typename S, typename T>
+ void eat (S &, T &v)
+{
+}
+
+void Foo ()
+{
+ auto lam = [](auto &) { };
+ auto lam_1 = [](int &, auto &) { };
+ auto lam_2 = [](auto &, X<int> &) { };
+ auto lam_3 = [](auto (*)[5]) { };
+
+ forward (lam);
+ forward (lam_1);
+ forward (lam_2);
+ forward (lam_3);
+
+ eat (lam);
+ eat (lam_1);
+ eat (lam_2);
+ eat (lam_3);
+
+ // The auto lambda should mangle similarly to the non-auto one
+ auto lambda_1 = [](float *, float *) { };
+ auto lambda_2 = [](auto *, auto *) { };
+ auto lambda_3 = [](auto *, auto *) { };
+
+ int *i;
+
+ eat (i, lambda_1);
+ eat (i, lambda_2);
+
+ // The autos should squangle to the first one.
+ eat (lambda_2, lambda_3);
+}
+
+template<typename X> void Bar ()
+{
+ auto lambda_1 = [](X *, float *, float *) { };
+ auto lambda_2 = [](X *, auto *, auto *) { };
+ auto lambda_3 = [](X *, auto *...) {};
+
+ int *i;
+
+ eat (i, lambda_1);
+ eat (i, lambda_2);
+ eat (i, lambda_3);
+}
+
+void Baz ()
+{
+ Bar<short> ();
+}
+
+// { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRT_E_EOS0_S1_:" } }
+// { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRiRT_E0_EOS1_S2_:" } }
+// { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRT_R1XIiEE1_EOS0_S1_:" } }
+// { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlPA5_T_E2_EOS0_RS0_:" } }
+// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRT_E_EvS1_:" } }
+// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRiRT_E0_EvS2_:" } }
+// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRT_R1XIiEE1_EvS1_:" } }
+// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPA5_T_E2_EvRS0_:" } }
+// { dg-final { scan-assembler "_Z3eatIPiZ3FoovEUlPfS1_E3_EvRT_RT0_:" } }
+// { dg-final { scan-assembler "_Z3eatIPiZ3FoovEUlPT_PT0_E4_EvRS1_RS3_:" } }
+// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPT_PT0_E4_Z3FoovEUlS1_S3_E5_EvRS0_RS2_:" } }
+// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPfS3_E_EvRT_RT0_:" } }
+// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPT_PT0_E0_EvRS3_RS5_:" } }
+// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPT_zE1_EvRS3_RT0_:" } }