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 Klecknervoid UseDependentArg() { throw DependentDefaultCopyArg<HasMember>(); } 29c01ee750SReid Kleckner ErrorInDependentArg()30c01ee750SReid Klecknervoid 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 Klecknervoid f(const Default &d) { 43c01ee750SReid Kleckner throw d; 44c01ee750SReid Kleckner } 45