aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-11-01 21:31:31 -0400
committerJason Merrill <jason@gcc.gnu.org>2010-11-01 21:31:31 -0400
commitddbbc9a109f3d8b91f5ba43a4b0d933d048a3b0f (patch)
tree82ebd2f5b98a6666636b46ec9382fdf7d0b34886
parentfa2200cbb1ef5a6a7bdb9a5ba708c7400eb6b404 (diff)
downloadgcc-ddbbc9a109f3d8b91f5ba43a4b0d933d048a3b0f.zip
gcc-ddbbc9a109f3d8b91f5ba43a4b0d933d048a3b0f.tar.gz
gcc-ddbbc9a109f3d8b91f5ba43a4b0d933d048a3b0f.tar.bz2
semantics.c (cxx_eval_constant_expression): Explain unacceptable use of variable better.
* semantics.c (cxx_eval_constant_expression): Explain unacceptable use of variable better. From-SVN: r166168
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c31
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/constant4.C2
-rw-r--r--gcc/testsuite/g++.dg/template/qualified-id3.C2
8 files changed, 41 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2e9f535..93f1b7a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-01 Jason Merrill <jason@redhat.com>
+
+ * semantics.c (cxx_eval_constant_expression): Explain
+ unacceptable use of variable better.
+
2010-11-01 Gabriel Dos Reis <gdr@cse.tamu.edu>
Jason Merrill <jason@redhat.com>
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 397d383..2b8e9e3 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -6513,7 +6513,36 @@ cxx_eval_constant_expression (const constexpr_call *call, tree t,
if (DECL_P (r))
{
if (!allow_non_constant)
- error ("%qD cannot appear in a constant expression", r);
+ {
+ tree type = TREE_TYPE (r);
+ error ("the value of %qD is not usable in a constant "
+ "expression", r);
+ if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
+ {
+ if (!CP_TYPE_CONST_P (type))
+ inform (DECL_SOURCE_LOCATION (r),
+ "%q#D is not const", r);
+ else if (CP_TYPE_VOLATILE_P (type))
+ inform (DECL_SOURCE_LOCATION (r),
+ "%q#D is volatile", r);
+ else if (!DECL_INITIAL (r))
+ inform (DECL_SOURCE_LOCATION (r),
+ "%qD was not initialized with a constant "
+ "expression", r);
+ else
+ gcc_unreachable ();
+ }
+ else
+ {
+ if (cxx_dialect >= cxx0x && !DECL_DECLARED_CONSTEXPR_P (r))
+ inform (DECL_SOURCE_LOCATION (r),
+ "%qD was not declared %<constexpr%>", r);
+ else
+ inform (DECL_SOURCE_LOCATION (r),
+ "%qD does not have integral or enumeration type",
+ r);
+ }
+ }
*non_constant_p = true;
}
break;
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
index f2b5384..c7757f4 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
@@ -55,7 +55,7 @@ constexpr complex I(0, 1); // OK -- literal complex
// 2 invoked with non-const args
-double x5 = 1.0;
+double x5 = 1.0; // { dg-message "not declared .constexpr" }
constexpr complex unit(x5, 0); // { dg-error "x5|argument" } error: x5 non-constant
const complex one(x5, 0); // OK, ‘‘ordinary const’’ -- dynamic
// initialization
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
index 597603c..08552cd 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
@@ -15,7 +15,7 @@ struct B
constexpr B(T _t): t(_t) { }
};
-B<int> b(1);
+B<int> b(1); // { dg-message "not declared .constexpr" }
SA(b.t==1); // { dg-error "non-constant condition|'b'" }
constexpr B<int> b2(1);
SA(b2.t==1);
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C
index 5e0c101..a902e0e 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C
@@ -17,7 +17,7 @@ inline constexpr double
squared(double x) { return x * x; }
constexpr int squarei(int x) { return x * x; }
-extern const int side;
+extern const int side; // { dg-message "not initialized with a constant expression" }
constexpr int area = squarei(side); // { dg-error "side|argument" }
// error: squarei(side) is not a constant expression
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C
index 2c53595..7637c0a 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C
@@ -7,7 +7,7 @@ struct B {
int i;
};
-int global; // not constant
+int global; // { dg-message "not const" }
struct D : B {
constexpr D() : B(global) { } // { dg-error "global|argument" }
diff --git a/gcc/testsuite/g++.dg/parse/constant4.C b/gcc/testsuite/g++.dg/parse/constant4.C
index b2c112c..4d9814f 100644
--- a/gcc/testsuite/g++.dg/parse/constant4.C
+++ b/gcc/testsuite/g++.dg/parse/constant4.C
@@ -16,7 +16,7 @@ void Foo ()
Y<I> i;
- static const unsigned J = X<T>::J;
+ static const unsigned J = X<T>::J; // { dg-message "not initialized with a constant expression" }
Y<J> j; // { dg-error "constant" "" }
}
diff --git a/gcc/testsuite/g++.dg/template/qualified-id3.C b/gcc/testsuite/g++.dg/template/qualified-id3.C
index 1fc1cc3..bbfb51e 100644
--- a/gcc/testsuite/g++.dg/template/qualified-id3.C
+++ b/gcc/testsuite/g++.dg/template/qualified-id3.C
@@ -2,7 +2,7 @@
template <const int N> struct A { };
template <class T> struct B {
- static const int c;
+ static const int c; // { dg-message "not initialized with a constant expression" }
typedef A<B<T>::c> C; // { dg-error "constant expression" }
};
template <class T> const int B<T>::c = sizeof (T);