diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2014-10-09 15:53:54 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2014-10-09 13:53:54 +0000 |
commit | d0ff1cb4d9b1972e0aa9535d77413e12c4e84fa2 (patch) | |
tree | 86be65ec8d99fa07ac9f9ddf60af5bb0015932c7 /gcc | |
parent | 12d3031b2c31ad7c9ec956eba52f8451f7b284aa (diff) | |
download | gcc-d0ff1cb4d9b1972e0aa9535d77413e12c4e84fa2.zip gcc-d0ff1cb4d9b1972e0aa9535d77413e12c4e84fa2.tar.gz gcc-d0ff1cb4d9b1972e0aa9535d77413e12c4e84fa2.tar.bz2 |
decl.c (grokdeclarator): constexpr only implies const in C++11.
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/decl.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-52892-1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C | 2 |
15 files changed, 41 insertions, 21 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1f9f412..ed71ec2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 9c8ecc0..d4adbeb 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0cee7d6..ceaf2b3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-52892-1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-52892-1.C index 8e6bc49..91e1ea7 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-52892-1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-52892-1.C @@ -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 } } } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C index 93f9141..005f530 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C @@ -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 } } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C index 34cdb73..6b908b6 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C @@ -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(); }; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C index 2a1897b..580fceb 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C @@ -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: diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C index e541bf9..c4c052a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C @@ -12,13 +12,13 @@ // 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; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C index 9e99d6d..34b557c 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C @@ -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; }; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C index 7a9086c..43e7388 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C @@ -3,7 +3,7 @@ struct A { constexpr A(int) { } - constexpr operator int() { return 1; }; + constexpr operator int() const { return 1; }; }; template <class T> diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C index 52fc9ea..6b6cf3d 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C @@ -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> diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C index c16fb15..a16e5c4 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C @@ -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 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C index 18648d9..6c7dc30 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C @@ -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; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C index ce1ce52..be3d48c 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C @@ -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 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C index 78065c3..99e4569 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C @@ -2,7 +2,7 @@ struct B { - constexpr operator int() { return 4; } + constexpr operator int() const { return 4; } }; template <int I> |