]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/5079 (Reference to static const int not eliminated during...
authorMark Mitchell <mark@codesourcery.com>
Thu, 28 Aug 2003 07:14:26 +0000 (07:14 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 28 Aug 2003 07:14:26 +0000 (07:14 +0000)
PR optimization/5079
* call.c (build_conditional_expr): Use decl_constant_value to
simplify the arguments.

PR optimization/5079
* g++.dg/opt/static3.C: New test.

From-SVN: r70881

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/static3.C [new file with mode: 0644]

index a779d62b40291f2bfa1fc08f09104429c15857e1..87857b249a70ca101c209d2db96e5e55fd7ed827 100644 (file)
@@ -1,3 +1,9 @@
+2003-08-28  Mark Mitchell  <mark@codesourcery.com>
+
+       PR optimization/5079
+       * call.c (build_conditional_expr): Use decl_constant_value to
+       simplify the arguments.
+
 2003-08-26  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * parser.c (struct cp_token): Use enum bitfields.
index a74fd63d556d993d2f1996041051a98fb682a85f..739ce71f590d5c1e7edb8d1eb96715920ba45ae2 100644 (file)
@@ -3358,6 +3358,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
     }
 
  valid_operands:
+  arg2 = decl_constant_value (arg2);
+  arg3 = decl_constant_value (arg3);
   result = fold (build (COND_EXPR, result_type, arg1, arg2, arg3));
   /* We can't use result_type below, as fold might have returned a
      throw_expr.  */
index 0877585bc0aa41b9cdff410b906537adb4b59b6d..e0c5d5b3b63d105154a1403698f7d48379b5bf0e 100644 (file)
@@ -1,3 +1,8 @@
+2003-08-28  Mark Mitchell  <mark@codesourcery.com>
+
+       PR optimization/5079
+       * g++.dg/opt/static3.C: New test.
+
 2003-08-27  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
 
        * gcc.misc-tests/gcov-10b.c: New test.
diff --git a/gcc/testsuite/g++.dg/opt/static3.C b/gcc/testsuite/g++.dg/opt/static3.C
new file mode 100644 (file)
index 0000000..00c7265
--- /dev/null
@@ -0,0 +1,35 @@
+// { dg-do link }
+
+class Foo {
+public:
+  // No out-of-class definition is provided for these class members.
+  // That's technically a violation of the standard, but no diagnostic
+  // is required, and, as a QOI issue, we should optimize away all
+  // references.
+  static const int erf = 0;
+  static const int foo = 1;
+};
+
+int one()
+{
+  return Foo::foo;
+}
+
+int two()
+{
+  return Foo::foo + Foo::erf;
+}
+
+int three(int x)
+{
+  return x ? Foo::erf : Foo::foo;
+}
+
+int i;
+
+int main ()
+{
+  one ();
+  two ();
+  three (i);
+}