forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -std=c++98 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 | FileCheck %s
 | |
| // RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 | FileCheck %s
 | |
| 
 | |
| struct S {
 | |
|   virtual ~S() { }
 | |
| };
 | |
| 
 | |
| // PR5706
 | |
| // Make sure this doesn't crash; the mangling doesn't matter because the name
 | |
| // doesn't have linkage.
 | |
| static struct : S { } obj8;
 | |
| 
 | |
| void f() {
 | |
|   // Make sure this doesn't crash; the mangling doesn't matter because the
 | |
|   // generated vtable/etc. aren't modifiable (although it would be nice for
 | |
|   // codesize to make it consistent inside inline functions).
 | |
|   static struct : S { } obj8;
 | |
| }
 | |
| 
 | |
| inline int f2() {
 | |
|   // FIXME: We don't mangle the names of a or x correctly!
 | |
|   static struct { int a() { static int x; return ++x; } } obj;
 | |
|   return obj.a();
 | |
| }
 | |
| 
 | |
| int f3() { return f2(); }
 | |
| 
 | |
| struct A {
 | |
|   typedef struct { int x; } *ptr;
 | |
|   ptr m;
 | |
|   int a() {
 | |
|     static struct x {
 | |
|       // FIXME: We don't mangle the names of a or x correctly!
 | |
|       int a(ptr A::*memp) { static int x; return ++x; }
 | |
|     } a;
 | |
|     return a.a(&A::m);
 | |
|   }
 | |
| };
 | |
| 
 | |
| int f4() { return A().a(); }
 | |
| 
 | |
| int f5() {
 | |
|   static union {
 | |
|     int a;
 | |
|   };
 | |
|   
 | |
|   // CHECK: _ZZ2f5vE1a
 | |
|   return a;
 | |
| }
 | |
| 
 | |
| #if __cplusplus <= 199711L
 | |
| int f6() {
 | |
|   static union {
 | |
|     union {
 | |
|       int : 1;
 | |
|     };
 | |
|     int b;
 | |
|   };
 | |
|   
 | |
|   // CXX98: _ZZ2f6vE1b
 | |
|   return b;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| int f7() {
 | |
|   static union {
 | |
|     union {
 | |
|       int b;
 | |
|     } a;
 | |
|   };
 | |
|   
 | |
|   // CHECK: _ZZ2f7vE1a
 | |
|   return a.b;
 | |
| }
 | |
| 
 | |
| // This used to cause an assert because the typedef-for-anonymous-tag
 | |
| // code was trying to claim the enum for the template.
 | |
| enum { T8 };
 | |
| template <class T> struct Test8 {
 | |
|   typedef T type;
 | |
|   Test8(type t) {} // tested later
 | |
| };
 | |
| template <class T> void make_test8(T value) { Test8<T> t(value); }
 | |
| void test8() { make_test8(T8); }
 | |
| 
 | |
| // CHECK-LABEL: define internal void @"_ZNV3$_35test9Ev"(
 | |
| typedef volatile struct {
 | |
|   void test9() volatile {}
 | |
| } Test9;
 | |
| void test9() {
 | |
|   Test9 a;
 | |
|   a.test9();
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: define internal void @"_ZN5Test8I3$_2EC1ES0_"(
 |