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