1f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - -std=c++11 | FileCheck %s
2f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer// PR13424
3f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer
4c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramernamespace Test1 {
5f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramerstruct X {
6c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer  virtual ~X(); // Key function.
7c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer  virtual void f(); // Not a key function.
8c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer};
9c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer
10c23aca44753ff65303fb19d4d6d2114018629f07Benjamin KramerX::~X() = default;
11c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer
12c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer// Verify that the vtable is emitted.
13c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer// CHECK: @_ZTVN5Test11XE = unnamed_addr constant
14c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer}
15c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer
16c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramernamespace Test2 {
17c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramerstruct X {
18c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer  virtual ~X() = default; // Not a key function.
19c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer  virtual void f(); // Key function.
20c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer};
21c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer
22c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramervoid X::f() {}
23c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer
24c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer// Verify that the vtable is emitted.
25c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer// CHECK: @_ZTVN5Test21XE = unnamed_addr constant
26c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer}
27c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer
28c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramernamespace Test3 {
29c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramerstruct X {
30c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer  virtual ~X() = delete; // Not a key function.
31c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer  virtual void f(); // Key function.
32f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer};
33f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer
34f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramervoid X::f() {}
35f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer
36c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer// Verify that the vtable is emitted.
37c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer// CHECK: @_ZTVN5Test31XE = unnamed_addr constant
38c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer}
39