1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor 3f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor// PR5290 4f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregorint const f0(); 5f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregorvoid f0_test() { 635e12c90c1b107a75c5615aa76fdbd403661aaa6Douglas Gregor decltype(0, f0()) i = 0; 7f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor i = 0; 8f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor} 9f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor 10f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregorstruct A { int a[1]; A() { } }; 11f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregortypedef A const AC; 12f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregorint &f1(int*); 13f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregorfloat &f2(int const*); 14f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor 15f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregorvoid test_f2() { 16f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor float &fr = f2(AC().a); 17f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor} 18f801dcff43b49509bf758e213de56288bd3e2a2eDouglas Gregor 196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <class T> 206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct Future { 216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines explicit Future(T v); 226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template <class F> 246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto call(F&& fn) -> decltype(fn(T())) { 256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return fn(T()); 266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template <class B, class F> 296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto then(F&& fn) -> decltype(call(fn)) 306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines { 316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return fn(T()); 326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid rdar16527205() { 366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Future<int> f1(42); 376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines f1.call([](int){ return Future<float>(0); }); 386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 40e3d49b44ad0596b2998ecf2e7ca78d59188920e5Francois Pichetnamespace pr10154 { 41e3d49b44ad0596b2998ecf2e7ca78d59188920e5Francois Pichet class A{ 42e3d49b44ad0596b2998ecf2e7ca78d59188920e5Francois Pichet A(decltype(nullptr) param); 43e3d49b44ad0596b2998ecf2e7ca78d59188920e5Francois Pichet }; 44fa16125aaf667c2bd80efcea403a7a71aa65da14Richard Smith} 45fa16125aaf667c2bd80efcea403a7a71aa65da14Richard Smith 46fa16125aaf667c2bd80efcea403a7a71aa65da14Richard Smithtemplate<typename T> struct S {}; 47fa16125aaf667c2bd80efcea403a7a71aa65da14Richard Smithtemplate<typename T> auto f(T t) -> decltype(S<int>(t)) { 48fa16125aaf667c2bd80efcea403a7a71aa65da14Richard Smith using U = decltype(S<int>(t)); 49fa16125aaf667c2bd80efcea403a7a71aa65da14Richard Smith using U = S<int>; 50fa16125aaf667c2bd80efcea403a7a71aa65da14Richard Smith return S<int>(t); 51fa16125aaf667c2bd80efcea403a7a71aa65da14Richard Smith} 521e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis 531e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidisstruct B { 541e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis B(decltype(undeclared)); // expected-error {{undeclared identifier}} 551e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis}; 561e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidisstruct C { 571e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis C(decltype(undeclared; // expected-error {{undeclared identifier}} \ 581e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis // expected-error {{expected ')'}} expected-note {{to match this '('}} 591e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis}; 60b578aee665aad5ed1a46a26217c730fdfbfc8c2eDavid Blaikie 6125b24eb889d633c4666001af107d8eb5c45dd065Richard Smithnamespace PR16529 { 6225b24eb889d633c4666001af107d8eb5c45dd065Richard Smith struct U {}; 6325b24eb889d633c4666001af107d8eb5c45dd065Richard Smith template <typename T> struct S { 6425b24eb889d633c4666001af107d8eb5c45dd065Richard Smith static decltype(T{}, U{}) &f(); 6525b24eb889d633c4666001af107d8eb5c45dd065Richard Smith }; 6625b24eb889d633c4666001af107d8eb5c45dd065Richard Smith U &r = S<int>::f(); 6725b24eb889d633c4666001af107d8eb5c45dd065Richard Smith} 6825b24eb889d633c4666001af107d8eb5c45dd065Richard Smith 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18876 { 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { ~A() = delete; }; // expected-note +{{here}} 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A f(); 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines decltype(f()) *a; // ok, function call 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines decltype(A()) *b; // expected-error {{attempt to use a deleted function}} 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines decltype(0, f()) *c; // ok, function call on RHS of comma 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines decltype(0, A()) *d; // expected-error {{attempt to use a deleted function}} 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines decltype(f(), 0) *e; // expected-error {{attempt to use a deleted function}} 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 79b578aee665aad5ed1a46a26217c730fdfbfc8c2eDavid Blaikietemplate<typename> 80b578aee665aad5ed1a46a26217c730fdfbfc8c2eDavid Blaikieclass conditional { 81b578aee665aad5ed1a46a26217c730fdfbfc8c2eDavid Blaikie}; 82b578aee665aad5ed1a46a26217c730fdfbfc8c2eDavid Blaikie 83b578aee665aad5ed1a46a26217c730fdfbfc8c2eDavid Blaikievoid foo(conditional<decltype((1),int>) { // expected-note 2 {{to match this '('}} expected-error {{expected ')'}} 84b578aee665aad5ed1a46a26217c730fdfbfc8c2eDavid Blaikie} // expected-error {{expected function body after function declarator}} expected-error 2 {{expected '>'}} expected-error {{expected ')'}} 85