1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s -std=c++11
2e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
3e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithstruct S {
4e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  virtual ~S();
5e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
6e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  void g() throw (auto(*)()->int);
7e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
8e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  // Note, this is not permitted: conversion-declarator cannot have a trailing return type.
9e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  // FIXME: don't issue the second diagnostic for this.
1014f78f4a11df4c06667e2cbb87eeb179e4cb46feRichard Smith  operator auto(*)()->int(); // expected-error{{'auto' not allowed in conversion function type}} expected-error {{C++ requires a type specifier}}
11e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith};
12e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
13e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithtypedef auto Fun(int a) -> decltype(a + a);
14e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithtypedef auto (*PFun)(int a) -> decltype(a + a);
15e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
16e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithvoid g(auto (*f)() -> int) {
17e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  try { }
18e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  catch (auto (&f)() -> int) { }
19e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  catch (auto (*const f[10])() -> int) { }
20e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith}
21e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
22e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithnamespace std {
23e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  class type_info;
24e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith}
25e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
26e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithtemplate<typename T> struct U {};
27e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
28e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithvoid j() {
29e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  (void)typeid(auto(*)()->void);
30e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  (void)sizeof(auto(*)()->void);
31e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  (void)__alignof(auto(*)()->void);
32e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
33e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  U<auto(*)()->void> v;
34e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
35e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  int n;
36e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  (void)static_cast<auto(*)()->void>(&j);
37e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  auto p = reinterpret_cast<auto(*)()->int>(&j);
38e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  (void)const_cast<auto(**)()->int>(&p);
39e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith  (void)(auto(*)()->void)(&j);
40e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith}
41e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
42e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithtemplate <auto (*f)() -> void = &j> class C { };
43e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithstruct F : auto(*)()->int {}; // expected-error{{expected class name}}
44e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithtemplate<typename T = auto(*)()->int> struct G { };
45e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smith
46e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithint g();
477796eb5643244f3134834253ce5ea89107ac21c1Richard Smithauto (*h)() -> auto = &g; // expected-error{{'auto' not allowed in function return type}}
48e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithauto (*i)() = &g; // ok; auto deduced as int.
49e7397c6a1bb2b205c5fe678e26199eb26d22e38eRichard Smithauto (*k)() -> int = i; // ok; no deduction.
50