1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
342dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl
442dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl// PR5426 - the non-dependent obj would be fully processed and wrapped in a
542dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl// CXXConstructExpr at definition time, which would lead to a failure at
642dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl// instantiation time.
742dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redlstruct arg {
842dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl  arg();
942dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl};
1042dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl
1142dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redlstruct oldstylemove {
1242dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl  oldstylemove(oldstylemove&);
1342dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl  oldstylemove(const arg&);
1442dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl};
1542dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl
1642dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redltemplate <typename T>
1742dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redlvoid fn(T t, const arg& arg) {
1842dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl  oldstylemove obj(arg);
1942dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl}
2042dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl
2142dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redlvoid test() {
2242dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl  fn(1, arg());
2342dddbeadb82a918d83c14bdcce47ba8c0ed6fbaSebastian Redl}
240b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor
250b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregorstruct X0 { };
260b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor
270b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregorstruct X1 {
280b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor  explicit X1(const X0 &x0 = X0());
290b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor};
300b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor
310b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregortemplate<typename T>
320b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregorvoid f0() {
330b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor  X1 x1;
340b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor}
350b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor
360b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregortemplate void f0<int>();
370b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregortemplate void f0<float>();
3867fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor
3967fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregorstruct NonTrivial {
4067fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor  NonTrivial();
4167fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor  ~NonTrivial();
4267fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor};
4367fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor
4467fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregortemplate<int N> void f1() {
4567fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor  NonTrivial array[N];
4667fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor}
4767fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregortemplate<> void f1<2>();
48