13951c28bSLiming Liu // RUN: %clang_cc1 -triple=x86_64-unknown-linux -emit-llvm %s -o - | FileCheck \ 23951c28bSLiming Liu // RUN: -check-prefix=CHECK-1 %s 33951c28bSLiming Liu // RUN: %clang_cc1 -triple=x86_64-unknown-linux -emit-llvm %s -o - | FileCheck \ 43951c28bSLiming Liu // RUN: -check-prefix=CHECK-2 %s 53951c28bSLiming Liu // RUN: %clang_cc1 -triple=x86_64-unknown-linux -emit-llvm %s -o - | FileCheck \ 63951c28bSLiming Liu // RUN: -check-prefix=CHECK-3 %s 73951c28bSLiming Liu 83951c28bSLiming Liu // CHECK-1: [[FOO:%.+]] = type { float } 93951c28bSLiming Liu struct foo { 103951c28bSLiming Liu float val; 113951c28bSLiming Liu }; 123951c28bSLiming Liu 133951c28bSLiming Liu template <typename T> struct bar : T { 143951c28bSLiming Liu }; 153951c28bSLiming Liu 163951c28bSLiming Liu struct baz : bar<foo> { 173951c28bSLiming Liu // CHECK-1: define{{.*}} float @_ZN3baz3getEv 18*94473f4dSHari Limaye // CHECK-1: {{%.+}} = getelementptr inbounds nuw [[FOO]], ptr {{%.+}}, i32 0, i32 0 193951c28bSLiming Liu float get() { 203951c28bSLiming Liu return val; 213951c28bSLiming Liu } 223951c28bSLiming Liu }; 233951c28bSLiming Liu 243951c28bSLiming Liu int qux() { 253951c28bSLiming Liu auto f = baz{}; 263951c28bSLiming Liu return f.get(); 273951c28bSLiming Liu } 283951c28bSLiming Liu 293951c28bSLiming Liu // CHECK-2: [[F:%.+]] = type { ptr } 303951c28bSLiming Liu struct f { 313951c28bSLiming Liu void *g; 323951c28bSLiming Liu }; 333951c28bSLiming Liu 343951c28bSLiming Liu template <typename j> struct k : j { 353951c28bSLiming Liu // CHECK-2: define{{.*}} void @_ZN1kI1fE1lEv 36*94473f4dSHari Limaye // CHECK-2: {{%.+}} = getelementptr inbounds nuw [[F]], ptr {{%.+}}, i32 0, i32 0 373951c28bSLiming Liu virtual void l(){ (void)f::g; } 383951c28bSLiming Liu }; 393951c28bSLiming Liu 403951c28bSLiming Liu k<f> q; 413951c28bSLiming Liu 423951c28bSLiming Liu // CHECK-3: [[BASE:%.+]] = type { i32 } 433951c28bSLiming Liu class Base { 443951c28bSLiming Liu protected: 453951c28bSLiming Liu int member; 463951c28bSLiming Liu }; 473951c28bSLiming Liu 483951c28bSLiming Liu template <typename Parent> 493951c28bSLiming Liu struct Subclass : public Parent { 503951c28bSLiming Liu // CHECK-3: define{{.*}} i32 @_ZN8SubclassI4BaseE4funcEv 51*94473f4dSHari Limaye // CHECK-3: {{%.+}} = getelementptr inbounds nuw [[BASE]], ptr {{%.+}}, i32 0, i32 0 523951c28bSLiming Liu int func() { return Base::member; } 533951c28bSLiming Liu }; 543951c28bSLiming Liu 553951c28bSLiming Liu using Impl = Subclass<Base>; 563951c28bSLiming Liu 573951c28bSLiming Liu int use() { 583951c28bSLiming Liu Impl i; 593951c28bSLiming Liu return i.func(); 603951c28bSLiming Liu } 61