decl.c (grokdeclarator): constexpr only implies const in C++11.
authorMarc Glisse <marc.glisse@inria.fr>
Thu, 9 Oct 2014 13:53:54 +0000 (15:53 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Thu, 9 Oct 2014 13:53:54 +0000 (13:53 +0000)
2014-10-09  Marc Glisse  <marc.glisse@inria.fr>

gcc/cp/
* decl.c (grokdeclarator): constexpr only implies const in C++11.
gcc/testsuite/
* g++.dg/cpp0x/constexpr-52892-1.C: Error on missing const in C++14.
* g++.dg/cpp0x/constexpr-array-ptr7.C: Likewise.
* g++.dg/cpp0x/constexpr-diag1.C: Add const.
* g++.dg/cpp0x/constexpr-diag3.C: Likewise.
* g++.dg/cpp0x/constexpr-ex1.C: Likewise.
* g++.dg/cpp0x/constexpr-ex2.C: Likewise.
* g++.dg/cpp0x/constexpr-ex4.C: Likewise.
* g++.dg/cpp0x/constexpr-initlist.C: Likewise.
* g++.dg/cpp0x/constexpr-ptrmem.C: Likewise.
* g++.dg/cpp0x/constexpr-ptrsub.C: Likewise.
* g++.dg/cpp0x/constexpr-ref4.C: Likewise.
* g++.dg/cpp0x/constexpr-static6.C: Likewise.

From-SVN: r216039

15 files changed:
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-52892-1.C
gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C
gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C
gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C
gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C
gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C

index 1f9f4121cd1d5b88c0e12779a1f232e2478965b0..ed71ec27ff27d5b006561e7cdf06218d9873c473 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-09  Marc Glisse  <marc.glisse@inria.fr>
+
+       * decl.c (grokdeclarator): constexpr only implies const in C++11.
+
 2014-10-08  Jason Merrill  <jason@redhat.com>
 
        PR c++/63405
index 9c8ecc0c4d06a6167022924b1d40e4bb43151a92..d4adbeb96ba1bfda3a60139793d14203559bd562 100644 (file)
@@ -10539,7 +10539,8 @@ grokdeclarator (const cp_declarator *declarator,
       && !NEW_DELETE_OPNAME_P (unqualified_id))
     {
       cp_cv_quals real_quals = memfn_quals;
-      if (constexpr_p && sfk != sfk_constructor && sfk != sfk_destructor)
+      if (cxx_dialect < cxx14 && constexpr_p
+         && sfk != sfk_constructor && sfk != sfk_destructor)
        real_quals |= TYPE_QUAL_CONST;
       type = build_memfn_type (type, ctype, real_quals, rqual);
     }
index 0cee7d6cf62834a672edb6317da85418c136a972..ceaf2b35d816ae4687f13fe67040e18948602c6c 100644 (file)
@@ -1,3 +1,18 @@
+2014-10-09  Marc Glisse  <marc.glisse@inria.fr>
+
+       * g++.dg/cpp0x/constexpr-52892-1.C: Error on missing const in C++14.
+       * g++.dg/cpp0x/constexpr-array-ptr7.C: Likewise.
+       * g++.dg/cpp0x/constexpr-diag1.C: Add const.
+       * g++.dg/cpp0x/constexpr-diag3.C: Likewise.
+       * g++.dg/cpp0x/constexpr-ex1.C: Likewise.
+       * g++.dg/cpp0x/constexpr-ex2.C: Likewise.
+       * g++.dg/cpp0x/constexpr-ex4.C: Likewise.
+       * g++.dg/cpp0x/constexpr-initlist.C: Likewise.
+       * g++.dg/cpp0x/constexpr-ptrmem.C: Likewise.
+       * g++.dg/cpp0x/constexpr-ptrsub.C: Likewise.
+       * g++.dg/cpp0x/constexpr-ref4.C: Likewise.
+       * g++.dg/cpp0x/constexpr-static6.C: Likewise.
+
 2014-10-09  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/63380
index 8e6bc49b63255b6a0e0058d99c69d14eabbb5dd2..91e1ea72c2de3df92ca113219bf25b484208c33b 100644 (file)
@@ -24,5 +24,5 @@ constexpr Defer<Function> make_deferred(const Function f) {
 
 int main() {
   constexpr auto deferred = make_deferred(&fibonacci);
-  static_assert(deferred(25) == 75025, "Static fibonacci call failed");
+  static_assert(deferred(25) == 75025, "Static fibonacci call failed"); // { dg-error "no match for call" "" { target c++14 } }
 }
index 93f91411447d91fe6858b209a5459175b8ce1aa9..005f5300d6f34d9bcd911736ad5c54781c4e6e09 100644 (file)
@@ -17,4 +17,4 @@ S::foo ()
 constexpr S s = { 0,1,2,3,4,5,6,7,8,9,10 };
 
 #define SA(X) static_assert ((X), #X)
-SA(s.foo() == 10);
+SA(s.foo() == 10); // { dg-error "discards qualifiers" "" { target c++14 } }
index 34cdb733e52d1cb7ecf638e24448242256692ddd..6b908b6dff8db83f9a8f38c8a1cb42bde3532683 100644 (file)
@@ -5,7 +5,7 @@ template <class T>
 struct A
 {
   T t;
-  constexpr int f() { return 42; } // { dg-error "enclosing class" }
+  constexpr int f() const { return 42; } // { dg-error "enclosing class" }
 };
 
 struct B { B(); operator int(); };
index 2a1897b6bfb197f4e46065554aed717fb1aa5a6c..580fceb72826e11be27702017d7f801ff489b1a6 100644 (file)
@@ -16,7 +16,7 @@ int main()
 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" }
+  constexpr double real() const { return re; } // { dg-error "not a literal type" }
   double imag() const { return im; }
 
 private:
index e541bf9fbdb0cb5d0962e9850bfe6e7496e54eae..c4c052a607ad6a702a407c453dbeee67848ef007 100644 (file)
 // 2 defined before first use
 // NOTE: this is only needed in contexts that require a constant-expression
 struct S {
-    constexpr int twice();
-    constexpr int t();         // { dg-message "used but never defined" }
+    constexpr int twice() const;
+    constexpr int t() const;   // { dg-message "used but never defined" }
 private:
     static constexpr int val = 7;  // constexpr variable
 };
 
-constexpr int S::twice() { return val + val; }
+constexpr int S::twice() const { return val + val; }
 constexpr S s = { };
 int x1 = s.twice();     // ok
 int x2 = s.t();         // error: S::t() not defined
@@ -44,8 +44,8 @@ const double* p = &x;          // the &x forces x into memory
 // 1
 struct complex {
    constexpr complex(double r, double i) : re(r), im(i) { }
-   constexpr double real() { return re; }
-   constexpr double imag() { return im; }
+   constexpr double real() const { return re; }
+   constexpr double imag() const { return im; }
 private:
    double re;
    double im;
index 9e99d6da4676d8a697a6f68881a9696cbc4fd78d..34b557ce76eb60efc2d2b9f2a6dfc12402582d2e 100644 (file)
@@ -7,8 +7,8 @@
 // p 4
 struct A {
   constexpr A(int i) : val(i) { }
-  constexpr operator int() { return val; }
-  constexpr operator long() { return -1; }
+  constexpr operator int() const { return val; }
+  constexpr operator long() const { return -1; }
 private:
   int val;
 };
index 7a9086cb7c1063d36dbf2f5ce43f25873e547235..43e738842f4a56d38745f9732a4fbf382f6f370c 100644 (file)
@@ -3,7 +3,7 @@
 struct A
 {
   constexpr A(int) { }
-  constexpr operator int() { return 1; };
+  constexpr operator int() const { return 1; };
 };
 
 template <class T>
index 52fc9ea8caa5bfc179a4e15c314525432527c050..6b6cf3dacaa6f471c427d7d6375a532353091ad5 100644 (file)
@@ -23,11 +23,11 @@ public:
   template<size_t N>
   constexpr initializer_list(const E(&array)[N]) : sz(N), start(array) {}
 
-  constexpr size_t size() { return sz; }
+  constexpr size_t size() const { return sz; }
 
-  constexpr const E* begin() { return start; }
+  constexpr const E* begin() const { return start; }
 
-  constexpr const E* end() { return start + sz; }
+  constexpr const E* end() const { return start + sz; }
 };
 
 template<class E, size_t N>
index c16fb15e7b806fb771638193d9f71795319aea7e..a16e5c4591660c2785bce3ce8de81396b8daecf8 100644 (file)
@@ -4,7 +4,7 @@ struct C { // literal type
   int m;
   int n;
   constexpr C(int m) : m(m), n(-m) {}
-  constexpr bool is_neg() { return m < 0; }
+  constexpr bool is_neg() const { return m < 0; }
 };
 
 constexpr bool check1(const C& c, int C:: *pm) { return c.*pm < 0; } // #1
index 18648d92d2e86640cd6b63d8141460f028f4ebf4..6c7dc302e31af875043957e30a018d66d7fc84c3 100644 (file)
@@ -5,7 +5,7 @@
 struct array
 {
   constexpr array() :x(0) {}
-  constexpr int const* begin() { return &x; }
+  constexpr int const* begin() const { return &x; }
   int x;
 };
 constexpr array aa;
index ce1ce5235c08f8f44874aac5e3f4cc50df1fd2ac..be3d48ca6f0a60b0f2a0b43891c6de3d6361d961 100644 (file)
@@ -4,8 +4,8 @@
 struct S
 {
   int s[1];
-  constexpr const int &foo (unsigned i) { return (i < 1 ? 0 : throw 1), s[i]; }
-  constexpr const int &bar (unsigned i) { return i < 1 ? s[i] : (throw 0, s[i]); }
+  constexpr const int &foo (unsigned i) const { return (i < 1 ? 0 : throw 1), s[i]; }
+  constexpr const int &bar (unsigned i) const { return i < 1 ? s[i] : (throw 0, s[i]); }
 };
 
 int
index 78065c3068b0cc2f87de0d62ad346f4b49b28788..99e456985b61d20e7c7af25e2e8f39700380af4b 100644 (file)
@@ -2,7 +2,7 @@
 
 struct B
 {
-  constexpr operator int() { return 4; }
+  constexpr operator int() const { return 4; }
 };
 
 template <int I>