1 //===----------------------- catch_function_01.cpp ------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // Can you have a catch clause of array type that catches anything? 11 12 // GCC incorrectly allows function pointer to be caught by reference. 13 // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69372 14 // XFAIL: gcc 15 // UNSUPPORTED: libcxxabi-no-exceptions 16 17 #include <cassert> 18 19 template <class Tp> can_convert(Tp)20bool can_convert(Tp) { return true; } 21 22 template <class> can_convert(...)23bool can_convert(...) { return false; } 24 f()25void f() {} 26 main()27int main() 28 { 29 typedef void Function(); 30 assert(!can_convert<Function&>(&f)); 31 assert(!can_convert<void*>(&f)); 32 try 33 { 34 throw f; // converts to void (*)() 35 assert(false); 36 } 37 catch (Function& b) // can't catch void (*)() 38 { 39 assert(false); 40 } 41 catch (void*) // can't catch as void* 42 { 43 assert(false); 44 } 45 catch(Function*) 46 { 47 } 48 catch (...) 49 { 50 assert(false); 51 } 52 } 53