xref: /llvm-project/clang/test/SemaCXX/default-arg-closures.cpp (revision 61195e12fc5cc128e5908cfb76a91ee6860659e5)
1c01ee750SReid Kleckner // RUN: %clang_cc1 -triple x86_64-windows-msvc -fexceptions -fcxx-exceptions -fms-extensions -verify %s -std=c++11
2c01ee750SReid Kleckner 
3c01ee750SReid Kleckner // The MS ABI has a few ways to generate constructor closures, which require
4c01ee750SReid Kleckner // instantiating and checking the semantics of default arguments. Make sure we
5c01ee750SReid Kleckner // do that right.
6c01ee750SReid Kleckner 
7c01ee750SReid Kleckner template <typename T>
8*61195e12SReid Kleckner struct DependentDefaultCtorArg {
9*61195e12SReid Kleckner   // expected-error@+1 {{type 'int' cannot be used prior to '::' because it has no members}}
10c01ee750SReid Kleckner   DependentDefaultCtorArg(int n = T::error);
11c01ee750SReid Kleckner };
12c01ee750SReid Kleckner struct
13c01ee750SReid Kleckner __declspec(dllexport) // expected-note {{due to 'ExportDefaultCtorClosure' being dllexported}}
14*61195e12SReid Kleckner ExportDefaultCtorClosure // expected-note {{in instantiation of default function argument expression for 'DependentDefaultCtorArg<int>' required here}} expected-note {{implicit default constructor for 'ExportDefaultCtorClosure' first required here}}
15*61195e12SReid Kleckner : DependentDefaultCtorArg<int>
16c01ee750SReid Kleckner {};
17c01ee750SReid Kleckner 
18c01ee750SReid Kleckner template <typename T>
19c01ee750SReid Kleckner struct DependentDefaultCopyArg {
DependentDefaultCopyArgDependentDefaultCopyArg20c01ee750SReid Kleckner   DependentDefaultCopyArg() {}
21c01ee750SReid Kleckner   // expected-error@+1 {{type 'int' cannot be used prior to '::' because it has no members}}
DependentDefaultCopyArgDependentDefaultCopyArg22c01ee750SReid Kleckner   DependentDefaultCopyArg(const DependentDefaultCopyArg &o, int n = T::member) {}
23c01ee750SReid Kleckner };
24c01ee750SReid Kleckner 
25c01ee750SReid Kleckner struct HasMember {
26c01ee750SReid Kleckner   enum { member = 0 };
27c01ee750SReid Kleckner };
UseDependentArg()28c01ee750SReid Kleckner void UseDependentArg() { throw DependentDefaultCopyArg<HasMember>(); }
29c01ee750SReid Kleckner 
ErrorInDependentArg()30c01ee750SReid Kleckner void ErrorInDependentArg() {
31c01ee750SReid Kleckner   throw DependentDefaultCopyArg<int>(); // expected-note {{required here}}
32c01ee750SReid Kleckner }
33c01ee750SReid Kleckner 
34c01ee750SReid Kleckner struct HasCleanup {
35c01ee750SReid Kleckner   ~HasCleanup();
36c01ee750SReid Kleckner };
37c01ee750SReid Kleckner 
38c01ee750SReid Kleckner struct Default {
39c01ee750SReid Kleckner   Default(const Default &o, int d = (HasCleanup(), 42));
40c01ee750SReid Kleckner };
41c01ee750SReid Kleckner 
f(const Default & d)42c01ee750SReid Kleckner void f(const Default &d) {
43c01ee750SReid Kleckner   throw d;
44c01ee750SReid Kleckner }
45