diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3b6101264353e052e6b1536bc2cce802eda0d337..6fc6b3996f8f2be073109a88296df1bc8c3e3feb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Sun Feb 16 23:07:52 CET 2003  Jan Hubicka  <jh@suse.cz>
+
+	* c-typeck.c (build_c_cast):  Fold constant variables into
+	initial values.
+
 2003-02-16  Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
 
 	* doc/install.texi (Specific): Fix link for m68k-att-sysv.
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index bbd94a044fafba5b26f9bffa148d13e638f7b882..f3b6bb96fbce821339a9fe4976c12991206ad8c3 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -3765,8 +3765,11 @@ build_c_cast (type, expr)
 		    get_alias_set (TREE_TYPE (type))))
 	    warning ("dereferencing type-punned pointer will break strict-aliasing rules");
 	}
-      
+
       ovalue = value;
+      /* Replace a nonvolatile const static variable with its value.  */
+      if (optimize && TREE_CODE (value) == VAR_DECL)
+	value = decl_constant_value (value);
       value = convert (type, value);
 
       /* Ignore any integer overflow caused by the cast.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 39436e8d9eecc81cd21b1b0431ea1f98c1ca3b14..0356de92d986845cbec61b3a3022e84a467aa61d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+Sun Feb 16 23:08:19 CET 2003  Jan HUbicka  <jh@suse.cz>
+
+	* gcc.dg/c90-const-expr-3.c (DZERO): New static variable
+	(foo): Add few extra tests
+	* gcc.dg/c99-const-expr-3.c: Likewise.
+	* gcc.c-torture/execute/20030216-1.c: New.
+
 2003-02-16  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
 	PR c++/9459
diff --git a/gcc/testsuite/gcc.c-torture/execute/20030216-1.c b/gcc/testsuite/gcc.c-torture/execute/20030216-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..2153bfdd71fea508aeedf55a285924c4d304cf8b
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20030216-1.c
@@ -0,0 +1,10 @@
+void link_error (void);
+const double one=1.0;
+main ()
+{
+#ifdef __OPTIMIZE__
+  if ((int) one != 1)
+    link_error ();
+#endif
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/c90-const-expr-3.c b/gcc/testsuite/gcc.dg/c90-const-expr-3.c
index 987284360d8662e4934d57e8b747d6d99b3516f5..4a0eb105ef503253a40c82feddeede20a176f617 100644
--- a/gcc/testsuite/gcc.dg/c90-const-expr-3.c
+++ b/gcc/testsuite/gcc.dg/c90-const-expr-3.c
@@ -6,6 +6,7 @@
    to give the correct behavior to conforming programs.  */
 
 static const int ZERO = 0;
+static const double DZERO = 0;
 
 int *a;
 int b;
@@ -36,4 +37,9 @@ foo (void)
   ASSERT_NOT_NPC ((char) ZERO);
   ASSERT_NPC ((int) 0);
   ASSERT_NOT_NPC ((int) ZERO);
+  ASSERT_NPC ((int) 0.0);
+  ASSERT_NOT_NPC ((int) DZERO);
+  ASSERT_NOT_NPC ((int) +0.0); /* { dg-bogus "incompatible" "bogus null pointer constant" { xfail *-*-* } } */
+  ASSERT_NOT_NPC ((int) (0.0+0.0)); /* { dg-bogus "incompatible" "bogus null pointer constant" { xfail *-*-* } } */
+  ASSERT_NOT_NPC ((int) (double)0.0); /* { dg-bogus "incompatible" "bogus null pointer constant" { xfail *-*-* } } */
 }
diff --git a/gcc/testsuite/gcc.dg/c99-const-expr-3.c b/gcc/testsuite/gcc.dg/c99-const-expr-3.c
index 7490f62a4ab48ea40827bd5ade169b6bd0389b74..096825eb8f5785757aaa9cebb99b2b1553ddeb04 100644
--- a/gcc/testsuite/gcc.dg/c99-const-expr-3.c
+++ b/gcc/testsuite/gcc.dg/c99-const-expr-3.c
@@ -6,6 +6,7 @@
    to give the correct behavior to conforming programs.  */
 
 static const int ZERO = 0;
+static const double DZERO = 0;
 
 int *a;
 int b;
@@ -36,4 +37,9 @@ foo (void)
   ASSERT_NOT_NPC ((char) ZERO);
   ASSERT_NPC ((int) 0);
   ASSERT_NOT_NPC ((int) ZERO);
+  ASSERT_NPC ((int) 0.0);
+  ASSERT_NOT_NPC ((int) DZERO);
+  ASSERT_NOT_NPC ((int) +0.0); /* { dg-bogus "incompatible" "bogus null pointer constant" { xfail *-*-* } } */
+  ASSERT_NOT_NPC ((int) (0.0+0.0)); /* { dg-bogus "incompatible" "bogus null pointer constant" { xfail *-*-* } } */
+  ASSERT_NOT_NPC ((int) (double)0.0); /* { dg-bogus "incompatible" "bogus null pointer constant" { xfail *-*-* } } */
 }