blob: 4eb69143a280aaab7f4dbaa5bd6b42daac04766d [file] [log] [blame]
Howard Hinnant4b3cb1c2012-02-01 19:42:45 +00001//===----------------------- 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
Eric Fiseliere65dd842016-01-20 04:06:46 +000012// 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
Asiri Rathnayake4174e8b2016-05-31 12:01:32 +000015// UNSUPPORTED: libcxxabi-no-exceptions
Eric Fiseliere65dd842016-01-20 04:06:46 +000016
Howard Hinnant4b3cb1c2012-02-01 19:42:45 +000017#include <cassert>
18
Eric Fiselierb979db12015-05-01 01:49:37 +000019template <class Tp>
20bool can_convert(Tp) { return true; }
21
22template <class>
23bool can_convert(...) { return false; }
24
Howard Hinnant4b3cb1c2012-02-01 19:42:45 +000025void f() {}
26
27int main()
28{
29 typedef void Function();
Eric Fiselierb979db12015-05-01 01:49:37 +000030 assert(!can_convert<Function&>(&f));
31 assert(!can_convert<void*>(&f));
Howard Hinnant4b3cb1c2012-02-01 19:42:45 +000032 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 }
Eric Fiselierb979db12015-05-01 01:49:37 +000041 catch (void*) // can't catch as void*
42 {
43 assert(false);
44 }
45 catch(Function*)
46 {
47 }
Howard Hinnant4b3cb1c2012-02-01 19:42:45 +000048 catch (...)
49 {
Eric Fiselierb979db12015-05-01 01:49:37 +000050 assert(false);
Howard Hinnant4b3cb1c2012-02-01 19:42:45 +000051 }
52}