]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
semantics.c (cxx_eval_constant_expression): Explain unacceptable use of variable...
authorJason Merrill <jason@redhat.com>
Tue, 2 Nov 2010 01:31:31 +0000 (21:31 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 2 Nov 2010 01:31:31 +0000 (21:31 -0400)
* semantics.c (cxx_eval_constant_expression): Explain
unacceptable use of variable better.

From-SVN: r166168

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C
gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C
gcc/testsuite/g++.dg/parse/constant4.C
gcc/testsuite/g++.dg/template/qualified-id3.C

index 2e9f535bef283d89f608c3bc446b2165feb2bbf0..93f1b7a7e438c8e60e2c2edc78b4a52a333ae695 100644 (file)
@@ -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>
 
index 397d383f650e45a2a4eb3316f77d253238f6e170..2b8e9e3f4b473682132bbfd4b523cd09e593a9dc 100644 (file)
@@ -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;
index f2b53846ecb03d452064f56e260ef717a1ad9b6f..c7757f4759889abe652e6de27cbef3b81a9b9ae6 100644 (file)
@@ -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
index 597603c39a47cfa306e0e9a7b0f219932b9a6148..08552cd7de73c83ba719cac774abe6f7b31fa2ad 100644 (file)
@@ -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);
index 5e0c101b2ba8e20bbb68de3b66cdf8ce2e56fe04..a902e0e226ccecc139105bc156b418d12dcb58d1 100644 (file)
@@ -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
 
index 2c53595833ea864dcf71841c4918913f02611748..7637c0a05bc51dfd56e765d83724ab6ab5043626 100644 (file)
@@ -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" }
index b2c112ce714a2b8367c42b5ed81e52fdad001d6e..4d9814fb485563261c65ebfca9211aebd3b06afd 100644 (file)
@@ -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" "" }
 }
index 1fc1cc320506b5d86ad214b762c6dfb500974690..bbfb51e4ce1be9009a0299783f26b2567464c14b 100644 (file)
@@ -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);