2009-05-30 14:31:56 +08:00
|
|
|
//-*- C++ -*-
|
|
|
|
|
|
|
|
// Intended to exercise all syntactic parts of the C++ language that
|
|
|
|
// aren't part of C.
|
|
|
|
|
|
|
|
namespace std {
|
|
|
|
namespace debug {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
using namespace std::debug;
|
|
|
|
using namespace std;
|
2009-05-30 14:48:27 +08:00
|
|
|
|
|
|
|
namespace safestl = ::std::debug;
|
2009-05-30 14:58:37 +08:00
|
|
|
|
|
|
|
class Base1 {
|
|
|
|
};
|
|
|
|
|
|
|
|
class Base2 { };
|
|
|
|
|
|
|
|
class Derived1 : Base1, virtual public Base2 { };
|
2010-12-15 23:06:14 +08:00
|
|
|
|
|
|
|
/* Template classes, template functions */
|
|
|
|
enum E1 { EC1 };
|
|
|
|
template <E1 v> class C1 {};
|
|
|
|
template <E1 v> C1<v> f1() { return C1<v>(); }
|
|
|
|
void f2() { f1<EC1>(); }
|
2017-01-03 20:07:20 +08:00
|
|
|
|
|
|
|
// Friend declarations
|
|
|
|
struct FriendlyStruct {
|
|
|
|
friend bool operator==(FriendlyStruct, FriendlyStruct) { return true; }
|
|
|
|
friend struct FriendedStruct;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct FriendedStruct { };
|
2017-01-03 20:08:40 +08:00
|
|
|
|
|
|
|
// Using declaration
|
|
|
|
namespace provider {
|
|
|
|
void foo();
|
|
|
|
}
|
|
|
|
namespace user {
|
|
|
|
using provider::foo;
|
|
|
|
}
|
2017-01-03 20:09:39 +08:00
|
|
|
|
|
|
|
// Empty declaration
|
|
|
|
;
|
2017-01-03 20:11:17 +08:00
|
|
|
|
|
|
|
// Template specialization declarations
|
|
|
|
template<typename T> class ClassTemplateSpecialization;
|
|
|
|
|
|
|
|
template<>
|
|
|
|
class ClassTemplateSpecialization<bool> { };
|
|
|
|
|
|
|
|
template<typename T, bool> struct ClassTemplatePartialSpecialization;
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
struct ClassTemplatePartialSpecialization<T, true> { };
|
2017-01-03 20:12:36 +08:00
|
|
|
|
|
|
|
// Access specifier
|
|
|
|
struct AccessSpec {
|
|
|
|
private:
|
|
|
|
};
|
2017-01-03 20:14:59 +08:00
|
|
|
|
|
|
|
// Variable template
|
|
|
|
template <typename T> T varTemplate = 0;
|
2017-01-03 20:16:02 +08:00
|
|
|
|
|
|
|
static_assert(true, "");
|
2021-07-01 05:05:34 +08:00
|
|
|
|
|
|
|
// Concepts
|
|
|
|
template<typename T> concept True = true;
|
|
|
|
template<typename T> concept Concept = requires (T a) {
|
|
|
|
a;
|
|
|
|
{ a() } noexcept -> True;
|
|
|
|
requires false || true;
|
|
|
|
typename T::type;
|
|
|
|
};
|
|
|
|
template<typename T> void constrained1() requires Concept<T>;
|
|
|
|
template<Concept T> void constrained2();
|
|
|
|
void constrained3(Concept auto x);
|