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