// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s // PR5290 int const f0(); void f0_test() { decltype(0, f0()) i = 0; i = 0; } struct A { int a[1]; A() { } }; typedef A const AC; int &f1(int*); float &f2(int const*); void test_f2() { float &fr = f2(AC().a); } template struct Future { explicit Future(T v); template auto call(F&& fn) -> decltype(fn(T())) { return fn(T()); } template auto then(F&& fn) -> decltype(call(fn)) { return fn(T()); } }; void rdar16527205() { Future f1(42); f1.call([](int){ return Future(0); }); } namespace pr10154 { class A{ A(decltype(nullptr) param); }; } template struct S {}; template auto f(T t) -> decltype(S(t)) { using U = decltype(S(t)); using U = S; return S(t); } struct B { B(decltype(undeclared)); // expected-error {{undeclared identifier}} }; struct C { C(decltype(undeclared; // expected-error {{undeclared identifier}} \ // expected-error {{expected ')'}} expected-note {{to match this '('}} }; namespace PR16529 { struct U {}; template struct S { static decltype(T{}, U{}) &f(); }; U &r = S::f(); } namespace PR18876 { struct A { ~A() = delete; }; // expected-note +{{here}} A f(); decltype(f()) *a; // ok, function call decltype(A()) *b; // expected-error {{attempt to use a deleted function}} decltype(0, f()) *c; // ok, function call on RHS of comma decltype(0, A()) *d; // expected-error {{attempt to use a deleted function}} decltype(f(), 0) *e; // expected-error {{attempt to use a deleted function}} } namespace D5789 { struct P1 { char x[6]; } g1 = { "foo" }; struct LP1 { struct P1 p1; }; // expected-warning@+3 {{subobject initialization overrides}} // expected-note@+2 {{previous initialization}} // expected-note@+1 {{previous definition}} template void foo(decltype(T(LP1{ .p1 = g1, .p1.x[1] = 'x' }))) {} // expected-warning@+3 {{subobject initialization overrides}} // expected-note@+2 {{previous initialization}} template void foo(decltype(T(LP1{ .p1 = g1, .p1.x[1] = 'r' }))) {} // okay // expected-warning@+3 {{subobject initialization overrides}} // expected-note@+2 {{previous initialization}} template void foo(decltype(T(LP1{ .p1 = { "foo" }, .p1.x[1] = 'x'}))) {} // okay // expected-warning@+3 {{subobject initialization overrides}} // expected-note@+2 {{previous initialization}} // expected-error@+1 {{redefinition of 'foo'}} template void foo(decltype(T(LP1{ .p1 = g1, .p1.x[1] = 'x' }))) {} } template class conditional { }; void foo(conditional) { // expected-note 2 {{to match this '('}} expected-error {{expected ')'}} } // expected-error {{expected function body after function declarator}} expected-error 2 {{expected '>'}} expected-error {{expected ')'}}