summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp0x/decltype4.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x/decltype4.C')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype4.C83
1 files changed, 83 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype4.C b/gcc/testsuite/g++.dg/cpp0x/decltype4.C
new file mode 100644
index 000000000..cd715cb28
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype4.C
@@ -0,0 +1,83 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+#define CHECK_DECLTYPE(DECLTYPE,RESULT) \
+ static_assert(is_same< DECLTYPE , RESULT >::value, #DECLTYPE " should be " #RESULT)
+
+struct A {
+ int x;
+ int& y;
+ int foo(char);
+ int& bar() const;
+};
+
+CHECK_DECLTYPE(decltype(&A::x), int A::*);
+decltype(&A::y) Ay; // { dg-error "cannot create pointer to reference member|invalid type" }
+CHECK_DECLTYPE(decltype(&A::foo), int (A::*) (char));
+CHECK_DECLTYPE(decltype(&A::bar), int& (A::*) () const);
+
+CHECK_DECLTYPE(decltype("decltype"), const char(&)[9]);
+CHECK_DECLTYPE(decltype(1), int);
+
+int an_int = 5;
+int& i = an_int;
+const int j = an_int;
+
+CHECK_DECLTYPE(decltype(i)&, int&);
+CHECK_DECLTYPE(const decltype(j), const int);
+
+int foo();
+CHECK_DECLTYPE(decltype(foo()), int);
+float& bar(int);
+CHECK_DECLTYPE(decltype (bar(1)), float&);
+const A bar();
+CHECK_DECLTYPE(decltype (bar()), const A);
+const A& bar2();
+CHECK_DECLTYPE(decltype (bar2()), const A&);
+
+void wibble() {
+ CHECK_DECLTYPE(decltype(1+2), int);
+ int* p;
+ CHECK_DECLTYPE(decltype(*p), int&);
+ int a[10];
+ CHECK_DECLTYPE(decltype(a[3]), int&);
+ int i; int& j = i;
+ CHECK_DECLTYPE(decltype (i = 5), int&);
+ CHECK_DECLTYPE(decltype (j = 5), int&);
+
+ CHECK_DECLTYPE(decltype (++i), int&);
+ CHECK_DECLTYPE(decltype (i++), int);
+}
+
+struct B {
+ B () : bit(), cbit() {}
+ int bit : 2;
+ const int cbit : 3;
+
+ void foo()
+ {
+ CHECK_DECLTYPE(decltype(bit), int);
+ CHECK_DECLTYPE(decltype((bit)), int&);
+ CHECK_DECLTYPE(decltype(cbit), const int);
+ CHECK_DECLTYPE(decltype((cbit)), const int&);
+ }
+};
+
+B b;
+const B& bc = b;
+CHECK_DECLTYPE(decltype(b.bit), int);
+CHECK_DECLTYPE(decltype(bc.bit), int);
+CHECK_DECLTYPE(decltype((b.bit)), int&);
+CHECK_DECLTYPE(decltype((bc.bit)), const int&);