forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -triple x86_64-windows -fsyntax-only -verify -fborland-extensions -fcxx-exceptions %s
 | |
| 
 | |
| // This test is from http://docwiki.embarcadero.com/RADStudio/en/Try
 | |
| 
 | |
| int puts(const char *);
 | |
| 
 | |
| template<typename T>
 | |
| int printf(const char *, T);
 | |
| 
 | |
| const char * strdup(const char *);
 | |
| 
 | |
| void free(const void *);
 | |
| 
 | |
| #define EXCEPTION_EXECUTE_HANDLER 1
 | |
| 
 | |
| class Exception
 | |
| {
 | |
| public:
 | |
|   Exception(const char* s = "Unknown"){what = strdup(s);      }
 | |
|   Exception(const Exception& e ){what = strdup(e.what); }
 | |
|   ~Exception()                   {free(what);         }
 | |
|   const char* msg() const             {return what;           }
 | |
| private:
 | |
|   const char* what;
 | |
| };
 | |
| 
 | |
| int main()
 | |
| {
 | |
|   float e, f, g;
 | |
|   try
 | |
|   {
 | |
|     try
 | |
|     {
 | |
|       f = 1.0;
 | |
|       g = 0.0;
 | |
|       try
 | |
|       {
 | |
|         puts("Another exception:");
 | |
| 
 | |
|         e = f / g;
 | |
|       }
 | |
|       __except(EXCEPTION_EXECUTE_HANDLER)
 | |
|       {
 | |
|         puts("Caught a C-based exception.");
 | |
|         throw(Exception("Hardware error: Divide by 0"));
 | |
|       }
 | |
|     }
 | |
|     catch(const Exception& e)
 | |
|     {
 | |
|       printf("Caught C++ Exception: %s :\n", e.msg());
 | |
|     }
 | |
|   }
 | |
|   __finally
 | |
|   {
 | |
|     puts("C++ allows __finally too!");
 | |
|   }
 | |
|   return e;
 | |
| }
 | |
| 
 | |
| namespace PR17584 {
 | |
| template <typename>
 | |
| void Except() {
 | |
|   __try {
 | |
|   } __except(true) {
 | |
|   }
 | |
| }
 | |
| 
 | |
| template <typename>
 | |
| void Finally() {
 | |
|   __try {
 | |
|   } __finally {
 | |
|   }
 | |
| }
 | |
| 
 | |
| template void Except<void>();
 | |
| template void Finally<void>();
 | |
| 
 | |
| }
 | |
| 
 | |
| void test___leave() {
 | |
|   // Most tests are in __try.c.
 | |
| 
 | |
|   // Clang accepts try with __finally. MSVC doesn't. (Maybe a Borland thing?)
 | |
|   // __leave in mixed blocks isn't supported.
 | |
|   try {
 | |
|     __leave; // expected-error{{'__leave' statement not in __try block}}
 | |
|   } __finally {
 | |
|   }
 | |
| }
 |