blob: 4eb69143a280aaab7f4dbaa5bd6b42daac04766d [file] [log] [blame]
Howard Hinnanta21f8c22012-02-01 19:42:451//===----------------------- 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 Fiselier3f7c2072016-01-20 04:06:4612// 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 Rathnayake57e446d2016-05-31 12:01:3215// UNSUPPORTED: libcxxabi-no-exceptions
Eric Fiselier3f7c2072016-01-20 04:06:4616
Howard Hinnanta21f8c22012-02-01 19:42:4517#include <cassert>
18
Eric Fiselier65ace9d2015-05-01 01:49:3719template <class Tp>
20bool can_convert(Tp) { return true; }
21
22template <class>
23bool can_convert(...) { return false; }
24
Howard Hinnanta21f8c22012-02-01 19:42:4525void f() {}
26
27int main()
28{
29 typedef void Function();
Eric Fiselier65ace9d2015-05-01 01:49:3730 assert(!can_convert<Function&>(&f));
31 assert(!can_convert<void*>(&f));
Howard Hinnanta21f8c22012-02-01 19:42:4532 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 Fiselier65ace9d2015-05-01 01:49:3741 catch (void*) // can't catch as void*
42 {
43 assert(false);
44 }
45 catch(Function*)
46 {
47 }
Howard Hinnanta21f8c22012-02-01 19:42:4548 catch (...)
49 {
Eric Fiselier65ace9d2015-05-01 01:49:3750 assert(false);
Howard Hinnanta21f8c22012-02-01 19:42:4551 }
52}