1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 %s -triple %itanium_abi_triple -std=c++11 -emit-llvm -o - | FileCheck %s
2b299d3516d4722ef527b1070bb87133427e621a3Anders Carlsson
3b299d3516d4722ef527b1070bb87133427e621a3Anders Carlsson// PR5021
4c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlssonnamespace PR5021 {
5c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson
6b299d3516d4722ef527b1070bb87133427e621a3Anders Carlssonstruct A {
7b299d3516d4722ef527b1070bb87133427e621a3Anders Carlsson  virtual void f(char);
8b299d3516d4722ef527b1070bb87133427e621a3Anders Carlsson};
9b299d3516d4722ef527b1070bb87133427e621a3Anders Carlsson
10b299d3516d4722ef527b1070bb87133427e621a3Anders Carlssonvoid f(A *a) {
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: call {{.*}}void %
12b299d3516d4722ef527b1070bb87133427e621a3Anders Carlsson  a->f('c');
13b299d3516d4722ef527b1070bb87133427e621a3Anders Carlsson}
1429f1a6070ac35fcbea9241c843df7f3f7c5c3228Anders Carlsson
1529f1a6070ac35fcbea9241c843df7f3f7c5c3228Anders Carlssonstruct B : virtual A {
1629f1a6070ac35fcbea9241c843df7f3f7c5c3228Anders Carlsson  virtual void f();
1729f1a6070ac35fcbea9241c843df7f3f7c5c3228Anders Carlsson};
1829f1a6070ac35fcbea9241c843df7f3f7c5c3228Anders Carlsson
1929f1a6070ac35fcbea9241c843df7f3f7c5c3228Anders Carlssonvoid f(B * b) {
2029f1a6070ac35fcbea9241c843df7f3f7c5c3228Anders Carlsson  b->f();
21c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson}
22c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson
23c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson}
24c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson
25c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlssonnamespace Test1 {
26c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson  struct A {
27c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson    virtual ~A();
28c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson  };
29c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson
30c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson  struct B : A {
31c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson    virtual ~B();
32c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson    virtual void f();
33c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson  };
34c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson
35c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson  void f(B *b) {
36c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson    b->f();
37c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson  }
38c1eec891eb008cf3bc89d69d90af82678513f79bAnders Carlsson}
393c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith
403c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smithnamespace VirtualNoreturn {
413c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith  struct A {
423c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith    [[noreturn]] virtual void f();
433c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith  };
443c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith
453c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith  // CHECK: @_ZN15VirtualNoreturn1f
463c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith  void f(A *p) {
473c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith    p->f();
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // CHECK: call {{.*}}void %{{[^#]*$}}
493c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith    // CHECK-NOT: unreachable
503c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith  }
513c5cd15da59d084ee441ac1512907a73f0e1f2bdRichard Smith}
52