inline short function00(short x) { return x + x; }
inline int function00(int x) { return x + x; }
+namespace N01 { struct S00; }
+
namespace N00 {
struct S00 {
char c;
operator int() { return i; }
};
struct S01 {};
-struct S03 {};
+struct S02 {};
+template <typename T> struct S03 {
+ struct S00 : N00::S00 {};
+};
+template <int I, template <typename> class U> struct S03<U<int>[I]>
+ : U<int>::S00 {
+ S03();
+ S03(int);
+ S03(short);
+ S03(char);
+ template <typename V = decltype(I)> S03(V);
+};
+template <> struct S03<S03<int>[42]> : S00 {};
}
namespace N01 {
struct S02 {};
}
+using namespace N00;
+
+template <int I, template <typename> class U> template <typename V> S03<U<int>[I]>::S03(V x) : S00(x) {}
+template <int I, template <typename> class U> S03<U<int>[I]>::S03() : S00(I) {}
+template <int I, template <typename> class U> S03<U<int>[I]>::S03(char x) : S00(x) {}
+template <int I, template <typename> class U> S03<U<int>[I]>::S03(short x) : S00(x) {}
+template <int I, template <typename> class U> S03<U<int>[I]>::S03(int x) : S00(x) {}
+
#pragma weak pragma_weak00
#pragma weak pragma_weak01
#pragma weak pragma_weak02
#include "m02.h"
#include "m03.h"
-inline int g() { return N00::S00('a').method00('b') + (int)N00::S00(42) + function00(42); }
+inline int g() { return N00::S00('a').method00('b') + (int)S00(42) + function00(42); }
#pragma weak pragma_weak02
#pragma weak pragma_weak05