185125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner// RUN: %clang_cc1 -verify -std=c++11 %s
285125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner
385125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turnertemplate<typename T> struct complex {
485125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  complex(T = T(), T = T());
585125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  void operator+=(complex);
685125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  T a, b;
785125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner};
885125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner
985125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turnervoid std_example() {
1085125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  complex<double> z;
1185125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  z = { 1, 2 };
1285125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  z += { 1, 2 };
1385125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner
1485125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  int a, b;
1585125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  a = b = { 1 };
1685125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  a = { 1 } = b; // expected-error {{initializer list cannot be used on the left hand side of operator '='}}
1785125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  a = a + { 4 }; // expected-error {{initializer list cannot be used on the right hand side of operator '+'}}
1885125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  a = { 3 } * { 4 }; // expected-error {{initializer list cannot be used on the left hand side of operator '*'}} \
1985125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner                        expected-error {{initializer list cannot be used on the right hand side of operator '*'}}
2085125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner}
2185125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner
2285125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turnerstruct S {
2385125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  constexpr S(int a, int b) : a(a), b(b) {}
2485125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  int a, b;
2585125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner};
2685125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turnerstruct T {
2785125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  constexpr int operator=(S s) const { return s.a; }
2885125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner  constexpr int operator+=(S s) const { return s.b; }
2985125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner};
3085125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turnerstatic_assert((T() = {4, 9}) == 4, "");
3185125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turnerstatic_assert((T() += {4, 9}) == 9, "");
3285125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner
3385125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turnerint k1 = T() = { 1, 2 } = { 3, 4 }; // expected-error {{initializer list cannot be used on the left hand side of operator '='}}
3485125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turnerint k2 = T() = { 1, 2 } + 1; // expected-error {{initializer list cannot be used on the left hand side of operator '+'}}
3585125480c07e11d5dd98f69b71bded86ee903075David 'Digit' Turner