| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // RUN: cxx_compiler -S %s -o %t.s |
| // RUN: cat %t.s | FileCheck prefixes %s |
| |
| // CHECK-DAG: _ZN4pqrsD1Ev |
| // CHECK-DAG: _ZN4abcdC1ERKS_ |
| // CHECK-NOT: _ZN4efghC1ERKS_ |
| |
| // CHECK-DAG: _ZN5pqrsRD1Ev |
| // CHECK-NOT: _ZN5abcdRC1ERKS_ |
| // CHECK-NOT: _ZN5efghRC1ERKS_ |
| |
| // CHECK-DAG: _ZN5abcdSC1ERKS_ |
| // CHECK-NOT: _ZN5efghSC1ERKS_ |
| // CHECK-NOT: _ZN5pqrsSC1ERKS_ |
| |
| struct pqrs { int a; int b; ~pqrs();}; // has non trivial dtor |
| struct abcd { int a; int b; abcd(const abcd&); }; // has non trivial copy ctor |
| struct efgh { int a; int b; }; |
| void foo(abcd x); |
| void foo(efgh x); |
| void foo(pqrs x); |
| extern abcd v_abcd; |
| extern efgh v_efgh; |
| extern pqrs v_pqrs; |
| |
| void bar() |
| { |
| // class with no copy ctor or non trivial dtor: 3.1.1: no copy ctor call |
| foo(v_abcd); |
| |
| // class with non-trivial copy-ctor. call it |
| foo(v_efgh); |
| |
| // class with non-trivial dtor |
| foo(v_pqrs); |
| } |
| |
| struct pqrsR { int a; int b; ~pqrsR();}; // has non trivial dtor |
| struct abcdR { int a; int b; abcdR(const abcdR&); }; // has non trivial copy ctor |
| struct efghR { int a; int b; }; |
| abcdR foo_abcd(); |
| efghR foo_efgh(); |
| pqrsR foo_pqrs(); |
| extern abcdR r_abcd; |
| extern efghR r_efgh; |
| extern pqrsR r_pqrs; |
| |
| // check the caller action at return |
| void barx() |
| { |
| // class with no copy ctor or non trivial dtor: 3.1.1: no copy ctor call |
| r_abcd = foo_abcd(); |
| |
| // class with non-trivial copy-ctor. call it |
| r_efgh = foo_efgh(); |
| |
| // class with non-trivial dtor |
| r_pqrs = foo_pqrs(); |
| } |
| |
| |
| // check the callee action for return |
| struct pqrsS { int a; int b; ~pqrsS();}; // has non trivial dtor |
| struct abcdS { int a; int b; abcdS(const abcdS&); }; // has non trivial copy ctor |
| struct efghS { int a; int b; }; |
| extern abcdS s_abcd; |
| extern efghS s_efgh; |
| extern pqrsS s_pqrs; |
| abcdS bar_abcd(){ return s_abcd;} |
| efghS bar_efgh(){ return s_efgh;} |
| pqrsS bar_pqrs(){ return s_pqrs;} |
| |