blob: b8570cdb76be68db8fe1eb699972c93080fac9d8 [file] [log] [blame]
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: cxx_compiler -c %s cxx_rtti -o %t1.o
// RUN: linker -o %t%exeext %t1.o
// RUN: runtool %t%exeext | grep "PASSED"
#include "../common/select2.h"
// test case from ABI testsuite
/*
Test case for sharing virtual bases.
In Derived_too,
the primary base class is NewShareme,
The bases Base and Shareme share vptr's
with Derived and are allocated at the
same offset as Derived.
Should get:
60% a.out
(long)(NewShareme *)dd - (long)dd = 0
(long)(Derived *)dd - (long)dd = 8
(long)(Base *)dd - (long)dd = 8
(long)(Shareme *)dd - (long)dd = 8
*/
struct Shareme {
virtual void foo();
};
struct Base : virtual Shareme {
virtual void bar();
};
struct Derived : virtual Base {
virtual void baz();
};
struct NewShareme {
virtual void foo();
};
struct Derived_too : virtual NewShareme, virtual Derived {
virtual void bar();
};
void Shareme::foo() { }
void Base::bar() { }
void Derived::baz() { }
void NewShareme::foo() { }
void Derived_too::bar() { }
extern "C" int printf(const char *,...);
//#define EVAL(EXPR) printf( #EXPR " = %d\n", (int) (EXPR) );
static int nerr;
static void evalf(int expected, const char *str, int val)
{
expected /= LPSELECT(1,2); //representing the size difference of pointers
if (expected != val) {
printf("ERROR: expected %d. ", expected);
nerr++;
}
printf(str, val);
}
#define EVAL(v,EXPR) evalf(v, #EXPR " = %d\n", (int) (EXPR) );
int main()
{
Derived_too *dd = new Derived_too;
EVAL(0, (long)(NewShareme *)dd - (long)dd);
EVAL(8, (long)(Derived *)dd - (long)dd);
EVAL(8, (long)(Base *)dd - (long)dd);
EVAL(8, (long)(Shareme *)dd - (long)dd);
printf("%s\n", nerr ? "FAILED" : "PASSED");
}