61 lines · cpp
1// RUN: %clang_cc1 -triple=x86_64-unknown-linux -emit-llvm %s -o - | FileCheck \2// RUN: -check-prefix=CHECK-1 %s3// RUN: %clang_cc1 -triple=x86_64-unknown-linux -emit-llvm %s -o - | FileCheck \4// RUN: -check-prefix=CHECK-2 %s5// RUN: %clang_cc1 -triple=x86_64-unknown-linux -emit-llvm %s -o - | FileCheck \6// RUN: -check-prefix=CHECK-3 %s7 8// CHECK-1: [[FOO:%.+]] = type { float }9struct foo {10 float val;11};12 13template <typename T> struct bar : T {14};15 16struct baz : bar<foo> {17 // CHECK-1: define{{.*}} float @_ZN3baz3getEv18 // CHECK-1: {{%.+}} = getelementptr inbounds nuw [[FOO]], ptr {{%.+}}, i32 0, i32 019 float get() {20 return val;21 }22};23 24int qux() {25 auto f = baz{};26 return f.get();27}28 29// CHECK-2: [[F:%.+]] = type { ptr }30struct f {31 void *g;32};33 34template <typename j> struct k : j {35 // CHECK-2: define{{.*}} void @_ZN1kI1fE1lEv36 // CHECK-2: {{%.+}} = getelementptr inbounds nuw [[F]], ptr {{%.+}}, i32 0, i32 037 virtual void l(){ (void)f::g; }38};39 40k<f> q;41 42// CHECK-3: [[BASE:%.+]] = type { i32 }43class Base {44protected:45 int member;46};47 48template <typename Parent>49struct Subclass : public Parent {50 // CHECK-3: define{{.*}} i32 @_ZN8SubclassI4BaseE4funcEv51 // CHECK-3: {{%.+}} = getelementptr inbounds nuw [[BASE]], ptr {{%.+}}, i32 0, i32 052 int func() { return Base::member; }53};54 55using Impl = Subclass<Base>;56 57int use() {58 Impl i;59 return i.func();60}61