Clang Project

clang_source_code/test/SemaCXX/default-arg-closures.cpp
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
7template <typename T>
8struct DependentDefaultCtorArg {
9  // expected-error@+1 {{type 'int' cannot be used prior to '::' because it has no members}}
10  DependentDefaultCtorArg(int n = T::error);
11};
12struct
13__declspec(dllexport) // expected-note {{due to 'ExportDefaultCtorClosure' being dllexported}}
14ExportDefaultCtorClosure // 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: DependentDefaultCtorArg<int>
16{};
17
18template <typename T>
19struct DependentDefaultCopyArg {
20  DependentDefaultCopyArg() {}
21  // expected-error@+1 {{type 'int' cannot be used prior to '::' because it has no members}}
22  DependentDefaultCopyArg(const DependentDefaultCopyArg &o, int n = T::member) {}
23};
24
25struct HasMember {
26  enum { member = 0 };
27};
28void UseDependentArg() { throw DependentDefaultCopyArg<HasMember>(); }
29
30void ErrorInDependentArg() {
31  throw DependentDefaultCopyArg<int>(); // expected-note {{required here}}
32}
33
34struct HasCleanup {
35  ~HasCleanup();
36};
37
38struct Default {
39  Default(const Default &o, int d = (HasCleanup(), 42));
40};
41
42void f(const Default &d) {
43  throw d;
44}
45