aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.cp/pass-by-ref-2.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.cp/pass-by-ref-2.cc')
-rw-r--r--gdb/testsuite/gdb.cp/pass-by-ref-2.cc295
1 files changed, 295 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.cp/pass-by-ref-2.cc b/gdb/testsuite/gdb.cp/pass-by-ref-2.cc
new file mode 100644
index 0000000..1cd5a16
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/pass-by-ref-2.cc
@@ -0,0 +1,295 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2019 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class ByVal {
+public:
+ ByVal (void);
+
+ int x;
+};
+
+ByVal::ByVal (void)
+{
+ x = 2;
+}
+
+class ByRef {
+public:
+ ByRef (void);
+
+ ByRef (const ByRef &rhs);
+
+ int x;
+};
+
+ByRef::ByRef (void)
+{
+ x = 2;
+}
+
+ByRef::ByRef (const ByRef &rhs)
+{
+ x = 3; /* ByRef-cctor */
+}
+
+class ArrayContainerByVal {
+public:
+ ByVal items[2];
+};
+
+int
+cbvArrayContainerByVal (ArrayContainerByVal arg)
+{
+ arg.items[0].x += 4; // intentionally modify
+ return arg.items[0].x;
+}
+
+class ArrayContainerByRef {
+public:
+ ByRef items[2];
+};
+
+int
+cbvArrayContainerByRef (ArrayContainerByRef arg)
+{
+ arg.items[0].x += 4; // intentionally modify
+ return arg.items[0].x;
+}
+
+class DynamicBase {
+public:
+ DynamicBase (void);
+
+ virtual int get (void);
+
+ int x;
+};
+
+DynamicBase::DynamicBase (void)
+{
+ x = 2;
+}
+
+int
+DynamicBase::get (void)
+{
+ return 42;
+}
+
+class Dynamic : public DynamicBase {
+public:
+ virtual int get (void);
+};
+
+int
+Dynamic::get (void)
+{
+ return 9999;
+}
+
+int
+cbvDynamic (DynamicBase arg)
+{
+ arg.x += 4; // intentionally modify
+ return arg.x + arg.get ();
+}
+
+class Inlined {
+public:
+ Inlined (void);
+
+ __attribute__((always_inline))
+ Inlined (const Inlined &rhs)
+ {
+ x = 3;
+ }
+
+ int x;
+};
+
+Inlined::Inlined (void)
+{
+ x = 2;
+}
+
+int
+cbvInlined (Inlined arg)
+{
+ arg.x += 4; // intentionally modify
+ return arg.x;
+}
+
+class DtorDel {
+public:
+ DtorDel (void);
+
+ ~DtorDel (void) = delete;
+
+ int x;
+};
+
+DtorDel::DtorDel (void)
+{
+ x = 2;
+}
+
+int
+cbvDtorDel (DtorDel arg)
+{
+ // Calling this method should be rejected
+ return arg.x;
+}
+
+class FourCCtor {
+public:
+ FourCCtor (void);
+
+ FourCCtor (FourCCtor &rhs);
+ FourCCtor (const FourCCtor &rhs);
+ FourCCtor (volatile FourCCtor &rhs);
+ FourCCtor (const volatile FourCCtor &rhs);
+
+ int x;
+};
+
+FourCCtor::FourCCtor (void)
+{
+ x = 2;
+}
+
+FourCCtor::FourCCtor (FourCCtor &rhs)
+{
+ x = 3;
+}
+
+FourCCtor::FourCCtor (const FourCCtor &rhs)
+{
+ x = 4;
+}
+
+FourCCtor::FourCCtor (volatile FourCCtor &rhs)
+{
+ x = 5;
+}
+
+FourCCtor::FourCCtor (const volatile FourCCtor &rhs)
+{
+ x = 6;
+}
+
+int
+cbvFourCCtor (FourCCtor arg)
+{
+ arg.x += 10; // intentionally modify
+ return arg.x;
+}
+
+class TwoMCtor {
+public:
+ TwoMCtor (void);
+
+ /* Even though one move ctor is defaulted, the other
+ is explicit. */
+ TwoMCtor (const TwoMCtor &&rhs);
+ TwoMCtor (TwoMCtor &&rhs) = default;
+
+ int x;
+};
+
+TwoMCtor::TwoMCtor (void)
+{
+ x = 2;
+}
+
+TwoMCtor::TwoMCtor (const TwoMCtor &&rhs)
+{
+ x = 3;
+}
+
+int
+cbvTwoMCtor (TwoMCtor arg)
+{
+ arg.x += 10; // intentionally modify
+ return arg.x;
+}
+
+class TwoMCtorAndCCtor {
+public:
+ TwoMCtorAndCCtor (void);
+
+ TwoMCtorAndCCtor (const TwoMCtorAndCCtor &rhs) = default;
+
+ /* Even though one move ctor is defaulted, the other
+ is explicit. This makes the type pass-by-ref. */
+ TwoMCtorAndCCtor (const TwoMCtorAndCCtor &&rhs);
+ TwoMCtorAndCCtor (TwoMCtorAndCCtor &&rhs) = default;
+
+ int x;
+};
+
+TwoMCtorAndCCtor::TwoMCtorAndCCtor (void)
+{
+ x = 2;
+}
+
+TwoMCtorAndCCtor::TwoMCtorAndCCtor (const TwoMCtorAndCCtor &&rhs)
+{
+ x = 4;
+}
+
+int
+cbvTwoMCtorAndCCtor (TwoMCtorAndCCtor arg)
+{
+ arg.x += 10; // intentionally modify
+ return arg.x;
+}
+
+ArrayContainerByVal arrayContainerByVal;
+ArrayContainerByRef arrayContainerByRef;
+Dynamic dynamic;
+Inlined inlined;
+// Cannot stack-allocate DtorDel
+DtorDel *dtorDel;
+FourCCtor fourCctor_c0v0;
+const FourCCtor fourCctor_c1v0;
+volatile FourCCtor fourCctor_c0v1;
+const volatile FourCCtor fourCctor_c1v1;
+TwoMCtor twoMctor;
+TwoMCtorAndCCtor twoMctorAndCctor;
+
+int
+main (void)
+{
+ int v;
+ dtorDel = new DtorDel;
+ /* Explicitly call the cbv function to make sure the compiler
+ will not omit any code in the binary. */
+ v = cbvArrayContainerByVal (arrayContainerByVal);
+ v = cbvArrayContainerByRef (arrayContainerByRef);
+ v = cbvDynamic (dynamic);
+ v = cbvInlined (inlined);
+ v = cbvFourCCtor (fourCctor_c0v0);
+ v = cbvFourCCtor (fourCctor_c1v0);
+ v = cbvFourCCtor (fourCctor_c0v1);
+ v = cbvFourCCtor (fourCctor_c1v1);
+ /* v = cbvTwoMCtor (twoMctor); */ // This is illegal, cctor is deleted
+ v = cbvTwoMCtorAndCCtor (twoMctorAndCctor);
+
+ /* stop here */
+
+ return 0;
+}