forked from OSchip/llvm-project
53 lines
955 B
C++
53 lines
955 B
C++
|
// RUN: clang -fsyntax-only %s
|
||
|
typedef char one_byte;
|
||
|
typedef char (&two_bytes)[2];
|
||
|
typedef char (&four_bytes)[4];
|
||
|
typedef char (&eight_bytes)[8];
|
||
|
|
||
|
template<int N> struct A { };
|
||
|
|
||
|
namespace N1 {
|
||
|
struct X { };
|
||
|
}
|
||
|
|
||
|
namespace N2 {
|
||
|
struct Y { };
|
||
|
|
||
|
two_bytes operator+(Y, Y);
|
||
|
}
|
||
|
|
||
|
namespace N3 {
|
||
|
struct Z { };
|
||
|
|
||
|
eight_bytes operator+(Z, Z);
|
||
|
}
|
||
|
|
||
|
namespace N4 {
|
||
|
one_byte operator+(N1::X, N2::Y);
|
||
|
|
||
|
template<typename T, typename U>
|
||
|
struct BinOpOverload {
|
||
|
typedef A<sizeof(T() + U())> type;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
namespace N1 {
|
||
|
four_bytes operator+(X, X);
|
||
|
}
|
||
|
|
||
|
namespace N3 {
|
||
|
eight_bytes operator+(Z, Z); // redeclaration
|
||
|
}
|
||
|
|
||
|
void test_bin_op_overload(A<1> *a1, A<2> *a2, A<4> *a4, A<8> *a8) {
|
||
|
typedef N4::BinOpOverload<N1::X, N2::Y>::type XY;
|
||
|
XY *xy = a1;
|
||
|
typedef N4::BinOpOverload<N1::X, N1::X>::type XX;
|
||
|
XX *xx = a4;
|
||
|
typedef N4::BinOpOverload<N2::Y, N2::Y>::type YY;
|
||
|
YY *yy = a2;
|
||
|
typedef N4::BinOpOverload<N3::Z, N3::Z>::type ZZ;
|
||
|
ZZ *zz = a8;
|
||
|
}
|
||
|
|