xref: /llvm-project/clang/test/CXX/class/class.init/class.copy.elision/p1.cpp (revision 703038b35a864d06e1926237c1568a430417b0b4)
1*703038b3SYang Fan // RUN: %clang_cc1 -std=c++20 -emit-llvm -triple x86_64-unknown-linux-gnu -o - %s | FileCheck %s
2*703038b3SYang Fan // RUN: %clang_cc1 -std=c++17 -emit-llvm -triple x86_64-unknown-linux-gnu -o - %s | FileCheck %s
3*703038b3SYang Fan // RUN: %clang_cc1 -std=c++14 -emit-llvm -triple x86_64-unknown-linux-gnu -o - %s | FileCheck %s
4*703038b3SYang Fan // RUN: %clang_cc1 -std=c++11 -emit-llvm -triple x86_64-unknown-linux-gnu -o - %s | FileCheck %s
5*703038b3SYang Fan 
6*703038b3SYang Fan // - volatile object in return statement don't match the rule for using move
7*703038b3SYang Fan //   operation instead of copy operation. Thus should call the copy constructor
8*703038b3SYang Fan //   A(const volatile A &).
9*703038b3SYang Fan //
10*703038b3SYang Fan // - volatile object in return statement also don't match the rule for copy
11*703038b3SYang Fan //   elision. Thus the copy constructor A(const volatile A &) cannot be elided.
12*703038b3SYang Fan namespace test_volatile {
13*703038b3SYang Fan class A {
14*703038b3SYang Fan public:
A()15*703038b3SYang Fan   A() {}
~A()16*703038b3SYang Fan   ~A() {}
17*703038b3SYang Fan   A(const volatile A &);
18*703038b3SYang Fan   A(volatile A &&);
19*703038b3SYang Fan };
20*703038b3SYang Fan 
test()21*703038b3SYang Fan A test() {
22*703038b3SYang Fan   volatile A a_copy;
23*703038b3SYang Fan   // CHECK: call void @_ZN13test_volatile1AC1ERVKS0_
24*703038b3SYang Fan   return a_copy;
25*703038b3SYang Fan }
26*703038b3SYang Fan } // namespace test_volatile
27