36 lines
806 B
C
36 lines
806 B
C
// { dg-do run }
|
|
template <typename _Tp, long _Nm> struct A {
|
|
typedef _Tp _Type[_Nm];
|
|
static _Tp &_S_ref(const _Type &p1, int p2) {
|
|
return const_cast<_Tp &>(p1[p2]);
|
|
}
|
|
};
|
|
template <typename _Tp, long _Nm> struct B {
|
|
typedef A<_Tp, _Nm> _AT_Type;
|
|
typename _AT_Type::_Type _M_elems;
|
|
_Tp &operator[](long p1) const { return _AT_Type::_S_ref(_M_elems, p1); }
|
|
};
|
|
int t;
|
|
void foo(int p1, int &p2) {
|
|
if ((t & 1) == 0) {
|
|
if (p1 != 1)
|
|
__builtin_abort();
|
|
if (p2 != 2)
|
|
__builtin_abort();
|
|
}
|
|
t++;
|
|
}
|
|
__attribute__((noinline))
|
|
void test1(const B<int, 2> &p1) { foo(p1[0], p1[1]); }
|
|
void test(B<B<int, 2>, 2> &p1) {
|
|
test1(p1[0]);
|
|
test1(p1[1]);
|
|
foo(p1[0][0], p1[0][1]);
|
|
}
|
|
int main() {
|
|
B<B<int, 2>, 2> t;
|
|
t[0][0] = 1;
|
|
t[0][1] = 2;
|
|
test(t);
|
|
}
|