c-common.c (constant_fits_type_p): New function.
authorJakub Jelinek <jakub@redhat.com>
Mon, 12 Feb 2001 08:34:30 +0000 (09:34 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 12 Feb 2001 08:34:30 +0000 (09:34 +0100)
* c-common.c (constant_fits_type_p): New function.
(convert_and_check): Use it.

* gcc.c-torture/compile/20010209-1.c: New test.

From-SVN: r39596

gcc/ChangeLog
gcc/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20010209-1.c [new file with mode: 0644]

index acab701e406534c63db988ecb37e052aa77a74ef..fbaa4c6cd603b20e234c1fd45ce031dceaceda55 100644 (file)
@@ -1,3 +1,8 @@
+2001-02-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-common.c (constant_fits_type_p): New function.
+       (convert_and_check): Use it.
+
 2001-02-11  Mark Mitchell  <mark@codesourcery.com>
 
        * Makefile.in (GXX_ABI_FLAG): Don't define.
index dfa58136f492e6df3855b0d8a3c2aa7968509155..5d3510c883479570e330279ba4d9c0bddc42112c 100644 (file)
@@ -232,6 +232,7 @@ static void add_attribute           PARAMS ((enum attrs, const char *,
                                                 int, int, int));
 static void init_attributes            PARAMS ((void));
 static int default_valid_lang_attribute PARAMS ((tree, tree, tree, tree));
+static int constant_fits_type_p                PARAMS ((tree, tree));
 
 /* Keep a stack of if statements.  We record the number of compound
    statements seen up to the if keyword, as well as the line number
@@ -1189,6 +1190,20 @@ unsigned_conversion_warning (result, operand)
     }
 }
 
+/* Nonzero if constant C has a value that is permissible
+   for type TYPE (an INTEGER_TYPE).  */
+
+static int
+constant_fits_type_p (c, type)
+     tree c, type;
+{
+  if (TREE_CODE (c) == INTEGER_CST)
+    return int_fits_type_p (c, type);
+
+  c = convert (type, c);
+  return !TREE_OVERFLOW (c);
+}     
+
 /* Convert EXPR to TYPE, warning about conversion problems with constants.
    Invoke this function on every expression that is converted implicitly,
    i.e. because of language rules and not because of an explicit cast.  */
@@ -1216,7 +1231,7 @@ convert_and_check (type, expr)
               don't warn unless pedantic.  */
            if ((pedantic
                 || TREE_UNSIGNED (type)
-                || ! int_fits_type_p (expr, unsigned_type (type)))
+                || ! constant_fits_type_p (expr, unsigned_type (type)))
                && skip_evaluation == 0)
              warning ("overflow in implicit constant conversion");
        }
index d17e44bdaa602a55ee8995523b33995a48911807..c8832787c323d4ee79b77e71312c3f3656bbc25c 100644 (file)
@@ -1,3 +1,7 @@
+2001-02-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c-torture/compile/20010209-1.c: New test.
+
 2001-02-11  Jeffrey Oldham  <oldham@codesourcery.com>
 
        * g++.old-deja/g++.other/crash26.C: XFAIL if parser produces
diff --git a/gcc/testsuite/gcc.c-torture/compile/20010209-1.c b/gcc/testsuite/gcc.c-torture/compile/20010209-1.c
new file mode 100644 (file)
index 0000000..2043464
--- /dev/null
@@ -0,0 +1,7 @@
+short int a;
+
+int main (void)
+{
+  a = 65535.0;
+  return 0;
+}