// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -triple x86_64-apple-darwin10 -emit-llvm %s -o - > %t
// RUN: FileCheck %s -check-prefix=CHECK-1 < %t
// RUN: FileCheck %s -check-prefix=CHECK-2 < %t

int f();

namespace {
  // CHECK-1: @_ZN12_GLOBAL__N_11bE = internal global i32 0
  // CHECK-1: @_ZN12_GLOBAL__N_11cE = internal global i32 0
  // CHECK-1: @_ZN12_GLOBAL__N_12c2E = internal global i32 0
  // CHECK-1: @_ZN12_GLOBAL__N_11D1dE = internal global i32 0
  // CHECK-1: @_ZN12_GLOBAL__N_11aE = internal global i32 0
  int a = 0;

  int b = f();

  static int c = f();

  // Note, we can't use an 'L' mangling for c or c2 (like GCC does) based on
  // the 'static' specifier, because the variable can be redeclared without it.
  extern int c2;
  int g() { return c2; }
  static int c2 = f();

  class D {
    static int d;
  };
  
  int D::d = f();

  // Check for generation of a VTT with internal linkage
  // CHECK-1: @_ZTSN12_GLOBAL__N_11X1EE = internal constant
  struct X { 
    struct EBase { };
    struct E : public virtual EBase { virtual ~E() {} };
  };

  // CHECK-1-LABEL: define internal noundef i32 @_ZN12_GLOBAL__N_13fooEv()
  int foo() {
    return 32;
  }

  // CHECK-1-LABEL: define internal noundef i32 @_ZN12_GLOBAL__N_11A3fooEv()
  namespace A {
    int foo() {
      return 45;
    }
  }
}

int concrete() {
  return a + foo() + A::foo();
}

void test_XE() { throw X::E(); }

// Miscompile on llvmc plugins.
namespace test2 {
  struct A {
    template <class T> struct B {
      static void foo() {}
    };
  };
  namespace {
    struct C;
  }

  // CHECK-2-LABEL: define{{.*}} void @_ZN5test24testEv()
  // CHECK-2:   call void @_ZN5test21A1BINS_12_GLOBAL__N_11CEE3fooEv()
  void test() {
    A::B<C>::foo();
  }

  // CHECK-2-LABEL: define internal void @_ZN5test21A1BINS_12_GLOBAL__N_11CEE3fooEv()
}

namespace {

int bar() {
  extern int a;
  return a;
}

} // namespace
