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