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 FanA 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