From: Paolo Carlini Date: Sun, 17 Nov 2013 19:22:43 +0000 (+0000) Subject: re PR c++/59123 ([c++11] can't forward-declare an object later defined constexpr) X-Git-Tag: releases/gcc-4.9.0~2725 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cce9196f4d5173e382b8e31eae1671fa1f302188;p=thirdparty%2Fgcc.git re PR c++/59123 ([c++11] can't forward-declare an object later defined constexpr) /cp 2013-11-17 Paolo Carlini PR c++/59123 * decl.c (validate_constexpr_redeclaration): Redeclarations of variables can differ in constexpr. /testsuite 2013-11-17 Paolo Carlini PR c++/59123 * g++.dg/cpp0x/constexpr-redeclaration1.C: New. * g++.dg/cpp0x/constexpr-decl.C: Adjust. From-SVN: r204923 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f52d9047f33..2729ec31f5d8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-11-17 Paolo Carlini + + PR c++/59123 + * decl.c (validate_constexpr_redeclaration): Redeclarations of + variables can differ in constexpr. + 2013-11-16 Paolo Carlini PR c++/29143 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 7d9d5df8f1d9..34d73be3e78c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1216,10 +1216,12 @@ validate_constexpr_redeclaration (tree old_decl, tree new_decl) if (! DECL_TEMPLATE_SPECIALIZATION (old_decl) && DECL_TEMPLATE_SPECIALIZATION (new_decl)) return true; + + error ("redeclaration %qD differs in %", new_decl); + error ("from previous declaration %q+D", old_decl); + return false; } - error ("redeclaration %qD differs in %", new_decl); - error ("from previous declaration %q+D", old_decl); - return false; + return true; } #define GNU_INLINE_P(fn) (DECL_DECLARED_INLINE_P (fn) \ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f7e1beb71c9..c58adf9e0dcc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-11-17 Paolo Carlini + + PR c++/59123 + * g++.dg/cpp0x/constexpr-redeclaration1.C: New. + * g++.dg/cpp0x/constexpr-decl.C: Adjust. + 2013-11-16 Paolo Carlini PR c++/29143 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C index 1af0662ff53b..f16f12c0f19b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C @@ -3,8 +3,7 @@ struct S { static constexpr int size; // { dg-error "must have an initializer" "must have" } - // { dg-error "previous declaration" "previous" { target *-*-* } 5 } }; const int limit = 2 * S::size; -constexpr int S::size = 256; // { dg-error "" } +constexpr int S::size = 256; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C new file mode 100644 index 000000000000..6010b207555a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C @@ -0,0 +1,10 @@ +// PR c++/59123 +// { dg-do compile { target c++11 } } + +// Fwd-declarations +struct S; +extern const S s; + +// (... later) definitions +struct S {}; +constexpr S s {};