[google/gcc-4_7] Allow static const floats unless -pedantic is passed (issue6212051)

2012-05-15 Thread Ollie Wild
To be applied to google/gcc-4_7.

Allow static const floats unless -pedantic is passed.

This patch allows us to migrate to C++11 more incrementally, since we can leave
the static const float initializations in place, flip the switch, and then
change it to use constexpr.

This is a forward port of r180638 from google/gcc-4_6 (despite the fact that
that revision says to NOT forward-port this).  Minor additional fixups have
been applied.

2012-05-15   Ollie Wild  a...@google.com

* gcc/cp/decl.c (check_static_variable_definition): Only generate a
constexpr warning when -pedantic is enabled.
* gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C: Replace -fpermissive
with -pedantic.
* gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C: New test.
* gcc/testsuite/g++.old-deja/g++.ext/memconst.C: Compile with -pedantic
-pedantic-errors to work around test failures with -std=gnu++11.

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index bb26d15..d2fe731 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7861,9 +7861,18 @@ check_static_variable_definition (tree decl, tree type)
error (in-class initialization of static data member %q#D of 
   incomplete type, decl);
   else if (literal_type_p (type))
-   permerror (input_location,
-  %constexpr% needed for in-class initialization of 
-  static data member %q#D of non-integral type, decl);
+   {
+  /* FIXME google: This local modification allows us to
+ transition from C++98 to C++11 without moving static
+ const floats out of the class during the transition.  It
+ should not be forward-ported to a 4.8 branch, since by
+ then we should be able to just fix the code to use
+ constexpr.  */
+  pedwarn (input_location, OPT_pedantic,
+   %constexpr% needed for in-class initialization of 
+   static data member %q#D of non-integral type, decl);
+  return 0;
+   }
   else
error (in-class initialization of static data member %q#D of 
   non-literal type, decl);
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C 
b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C
index 7c84cf8..658a458 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C
@@ -1,5 +1,5 @@
 // PR c++/50258
-// { dg-options -std=c++0x -fpermissive }
+// { dg-options -std=c++0x -pedantic }
 
 struct Foo {
   static const double d = 3.14; // { dg-warning constexpr }
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C 
b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C
new file mode 100644
index 000..28d34a1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C
@@ -0,0 +1,7 @@
+// PR c++/50258
+// { dg-options -std=c++0x }
+
+struct Foo {
+  static const double d = 3.14; // no warning
+};
+const double Foo::d;
diff --git a/gcc/testsuite/g++.old-deja/g++.ext/memconst.C 
b/gcc/testsuite/g++.old-deja/g++.ext/memconst.C
index d934763..7e86156 100644
--- a/gcc/testsuite/g++.old-deja/g++.ext/memconst.C
+++ b/gcc/testsuite/g++.old-deja/g++.ext/memconst.C
@@ -1,5 +1,5 @@
 // { dg-do assemble  }
-// { dg-options  }
+// { dg-options -pedantic -pedantic-errors }
 // From: ove.ewer...@syscon.uu.se (Ove Ewerlid)
 // Subject: ss-940630:cc1plus: internal error
 // Date: Sat, 2 Jul 1994 05:07:20 +0200

--
This patch is available for review at http://codereview.appspot.com/6212051


Re: [google/gcc-4_7] Allow static const floats unless -pedantic is passed (issue6212051)

2012-05-15 Thread Jeffrey Yasskin
Looks good to me. Yay for kicking the can down the road. ;)

On Tue, May 15, 2012 at 12:57 PM, Ollie Wild a...@google.com wrote:
 To be applied to google/gcc-4_7.

 Allow static const floats unless -pedantic is passed.

 This patch allows us to migrate to C++11 more incrementally, since we can 
 leave
 the static const float initializations in place, flip the switch, and then
 change it to use constexpr.

 This is a forward port of r180638 from google/gcc-4_6 (despite the fact that
 that revision says to NOT forward-port this).  Minor additional fixups have
 been applied.

 2012-05-15   Ollie Wild  a...@google.com

        * gcc/cp/decl.c (check_static_variable_definition): Only generate a
        constexpr warning when -pedantic is enabled.
        * gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C: Replace -fpermissive
        with -pedantic.
        * gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C: New test.
        * gcc/testsuite/g++.old-deja/g++.ext/memconst.C: Compile with -pedantic
        -pedantic-errors to work around test failures with -std=gnu++11.

 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
 index bb26d15..d2fe731 100644
 --- a/gcc/cp/decl.c
 +++ b/gcc/cp/decl.c
 @@ -7861,9 +7861,18 @@ check_static_variable_definition (tree decl, tree type)
        error (in-class initialization of static data member %q#D of 
               incomplete type, decl);
       else if (literal_type_p (type))
 -       permerror (input_location,
 -                  %constexpr% needed for in-class initialization of 
 -                  static data member %q#D of non-integral type, decl);
 +       {
 +          /* FIXME google: This local modification allows us to
 +             transition from C++98 to C++11 without moving static
 +             const floats out of the class during the transition.  It
 +             should not be forward-ported to a 4.8 branch, since by
 +             then we should be able to just fix the code to use
 +             constexpr.  */
 +          pedwarn (input_location, OPT_pedantic,
 +                   %constexpr% needed for in-class initialization of 
 +                   static data member %q#D of non-integral type, decl);
 +          return 0;
 +       }
       else
        error (in-class initialization of static data member %q#D of 
               non-literal type, decl);
 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C 
 b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C
 index 7c84cf8..658a458 100644
 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C
 +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C
 @@ -1,5 +1,5 @@
  // PR c++/50258
 -// { dg-options -std=c++0x -fpermissive }
 +// { dg-options -std=c++0x -pedantic }

  struct Foo {
   static const double d = 3.14; // { dg-warning constexpr }
 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C 
 b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C
 new file mode 100644
 index 000..28d34a1
 --- /dev/null
 +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C
 @@ -0,0 +1,7 @@
 +// PR c++/50258
 +// { dg-options -std=c++0x }
 +
 +struct Foo {
 +  static const double d = 3.14; // no warning
 +};
 +const double Foo::d;
 diff --git a/gcc/testsuite/g++.old-deja/g++.ext/memconst.C 
 b/gcc/testsuite/g++.old-deja/g++.ext/memconst.C
 index d934763..7e86156 100644
 --- a/gcc/testsuite/g++.old-deja/g++.ext/memconst.C
 +++ b/gcc/testsuite/g++.old-deja/g++.ext/memconst.C
 @@ -1,5 +1,5 @@
  // { dg-do assemble  }
 -// { dg-options  }
 +// { dg-options -pedantic -pedantic-errors }
  // From: ove.ewer...@syscon.uu.se (Ove Ewerlid)
  // Subject: ss-940630:cc1plus: internal error
  // Date: Sat, 2 Jul 1994 05:07:20 +0200

 --
 This patch is available for review at http://codereview.appspot.com/6212051