|  | // RUN: %clang_cc1 -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; | 
|  | } | 
|  |  | 
|  | int f6() { | 
|  | static union { | 
|  | union { | 
|  | int : 1; | 
|  | }; | 
|  | int b; | 
|  | }; | 
|  |  | 
|  | // CHECK: _ZZ2f6vE1b | 
|  | return b; | 
|  | } | 
|  |  | 
|  | 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_"( |