summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-06-29 10:34:58 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-06-29 10:34:58 -0400
commitf732fa7b6cd8f125f19aa150d88d47a15e0099cc (patch)
treec78bb4975e01ac82dfc07cfc5592be17dedd13d2 /gcc/testsuite/g++.dg
parent874d29e5bebbebee89836e041a0de18d183d7303 (diff)
downloadgcc-f732fa7b6cd8f125f19aa150d88d47a15e0099cc.tar.gz
re PR c++/45923 (constexpr diagnostics, more more)
PR c++/45923 * class.c (explain_non_literal_class): New. (finalize_literal_type_property): Call it. * cp-tree.h: Declare it. * semantics.c (ensure_literal_type_for_constexpr_object): Call it. (is_valid_constexpr_fn): Likewise. (massage_constexpr_body): Split out from... (register_constexpr_fundef): ...here. (is_instantiation_of_constexpr): New. (expand_or_defer_fn_1): Leave DECL_SAVED_TREE alone in that case. (explain_invalid_constexpr_fn): New. (cxx_eval_call_expression): Call it. (potential_constant_expression_1): Likewise. Avoid redundant errors. * method.c (process_subob_fn): Diagnose non-constexpr. (walk_field_subobs): Likewise. (synthesized_method_walk): Don't shortcut if we want diagnostics. (explain_implicit_non_constexpr): New. (defaulted_late_check): Use it. * call.c (build_cxx_call): Remember location. From-SVN: r175646
Diffstat (limited to 'gcc/testsuite/g++.dg')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C54
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C2
5 files changed, 59 insertions, 5 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C
index 183d3f768fa..44e6bc7e089 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C
@@ -13,7 +13,7 @@ struct B { B(); operator int(); };
constexpr A<int> ai = { 42 };
constexpr int i = ai.f();
-constexpr int b = A<B>().f(); // { dg-error "not a constexpr function" }
+constexpr int b = A<B>().f(); // { dg-error "non-constexpr function" }
template <class T>
constexpr int f (T t) { return 42; } // { dg-error "parameter" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C
new file mode 100644
index 00000000000..100c17edb45
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C
@@ -0,0 +1,54 @@
+// PR c++/45923
+// { dg-options -std=c++0x }
+
+int f(int);
+
+template <class T>
+constexpr T g(T t) { return f(t); } // { dg-error "f.int" }
+
+int main()
+{
+ constexpr int i = g(1); // { dg-error "g.T" }
+}
+
+// --------------------
+
+struct complex // { dg-message "no constexpr constructor" }
+{
+ complex(double r, double i) : re(r), im(i) { }
+ constexpr double real() { return re; } // { dg-error "not a literal type" }
+ double imag() const { return im; }
+
+private:
+ double re;
+ double im;
+};
+
+constexpr complex co1(0, 1); // { dg-error "not literal" }
+constexpr double dd2 = co1.real(); // { dg-error "non-constexpr function" }
+
+// --------------------
+
+struct base // { dg-message "no constexpr constructor" }
+{
+ int _M_i;
+ base() : _M_i(5) { }
+};
+
+struct derived : public base // { dg-message "base class" }
+{
+ constexpr derived(): base() { } // { dg-error "non-constexpr function" }
+};
+
+constexpr derived obj; // { dg-error "not literal" }
+
+// --------------------
+
+struct Def
+{
+ int _M_i; // { dg-message "does not initialize" }
+
+ constexpr Def() = default; // { dg-error "implicit declaration is not constexpr" }
+};
+
+constexpr Def defobj; // { dg-error "uninitialized" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
index 4ab4677805f..584a5a09b69 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
@@ -88,7 +88,7 @@ struct resource {
}
};
constexpr resource f(resource d)
-{ return d; } // { dg-error "not .constexpr" }
+{ return d; } // { dg-error "non-constexpr" }
constexpr resource d = f(9); // { dg-error "resource" }
// 4.4 floating-point constant expressions
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C
index f1d9ccee790..1831a2b003c 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C
@@ -19,5 +19,5 @@ struct C
constexpr int i = f(C<int>());
constexpr int j = C<int>().m(C<int>());
-constexpr int k = C<double>().m(A()); // { dg-error "not a constexpr function" }
-constexpr int l = g(C<double>(),A()); // { dg-error "not a constexpr function" }
+constexpr int k = C<double>().m(A()); // { dg-error "non-constexpr function" }
+constexpr int l = g(C<double>(),A()); // { dg-error "non-constexpr function" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C
index dc0b7429dc6..f61535f06be 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C
@@ -28,4 +28,4 @@ struct D
C<D> c;
};
-constexpr D d {}; // { dg-error "not a constexpr function" }
+constexpr D d {}; // { dg-error "non-constexpr function" }