[clang-tidy][use-internal-linkage]fix false positives for global overloaded operator...
[llvm-project.git] / clang / test / SemaCXX / __try.cpp
blobeb4612f508d373384ba5a4693c6a12c8fa6a7073
1 // RUN: %clang_cc1 -triple x86_64-windows -fsyntax-only -verify -fborland-extensions -fcxx-exceptions %s
3 // This test is from http://docwiki.embarcadero.com/RADStudio/en/Try
5 int puts(const char *);
7 template<typename T>
8 int printf(const char *, T);
10 const char * strdup(const char *);
12 void free(const void *);
14 #define EXCEPTION_EXECUTE_HANDLER 1
16 class Exception
18 public:
19 Exception(const char* s = "Unknown"){what = strdup(s); }
20 Exception(const Exception& e ){what = strdup(e.what); }
21 ~Exception() {free(what); }
22 const char* msg() const {return what; }
23 private:
24 const char* what;
27 int main()
29 float e, f, g;
30 try
32 try
34 f = 1.0;
35 g = 0.0;
36 try
38 puts("Another exception:");
40 e = f / g;
42 __except(EXCEPTION_EXECUTE_HANDLER)
44 puts("Caught a C-based exception.");
45 throw(Exception("Hardware error: Divide by 0"));
48 catch(const Exception& e)
50 printf("Caught C++ Exception: %s :\n", e.msg());
53 __finally
55 puts("C++ allows __finally too!");
57 return e;
60 namespace PR17584 {
61 template <typename>
62 void Except() {
63 __try {
64 } __except(true) {
68 template <typename>
69 void Finally() {
70 __try {
71 } __finally {
75 template void Except<void>();
76 template void Finally<void>();
80 void test___leave() {
81 // Most tests are in __try.c.
83 // Clang accepts try with __finally. MSVC doesn't. (Maybe a Borland thing?)
84 // __leave in mixed blocks isn't supported.
85 try {
86 __leave; // expected-error{{'__leave' statement not in __try block}}
87 } __finally {