xref: /llvm-project/clang/test/CodeGenCXX/decl-ref-inheritance.cpp (revision 94473f4db6a6f5f12d7c4081455b5b596094eac5)
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