re PR c++/5132 (NaN = 0.0 * HUGE_VAL fails to compile in templates)
authorNathan Sidwell <nathan@codesourcery.com>
Wed, 2 Jan 2002 11:29:15 +0000 (11:29 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 2 Jan 2002 11:29:15 +0000 (11:29 +0000)
cp:
PR c++/5132
* decl2.c (reparse_absdcl_as_casts): Don't digest_init if we
are processing a template decl.
testsuite:
* g++.dg/template/ctor1.C: New test.

From-SVN: r48464

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/ctor1.C [new file with mode: 0644]

index beaf19a913d39a0966d9cdf577dec41cb569a973..a6ecc50a3a5f4b0a6d709b06df2571c3a1b323b5 100644 (file)
@@ -1,3 +1,9 @@
+2002-01-02  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/5132
+       * decl2.c (reparse_absdcl_as_casts): Don't digest_init if we
+       are processing a template decl.
+
 2002-01-02  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/5116, c++/764
index cde4e698655eccf21c6f4ad82c7af9a2ca738e92..401ccbf20f3529226c35ba2d3a0262d63a097631 100644 (file)
@@ -1,6 +1,6 @@
 /* Process declarations and variables for C compiler.
    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    Hacked by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GNU CC.
@@ -3622,12 +3622,16 @@ reparse_absdcl_as_casts (decl, expr)
       type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl)));
       decl = TREE_OPERAND (decl, 0);
 
-      expr = digest_init (type, expr, (tree *) 0);
-      if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
+      if (processing_template_decl)
+       expr = build_min (CONSTRUCTOR, type, decl, CONSTRUCTOR_ELTS (expr));
+      else
        {
-         int failure = complete_array_type (type, expr, 1);
-         if (failure)
-           my_friendly_abort (78);
+         expr = digest_init (type, expr, (tree *) 0);
+         if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
+           {
+             int failure = complete_array_type (type, expr, 1);
+             my_friendly_assert (!failure, 78);
+           }
        }
     }
 
index dc7029de44ed039be96df18bfe555c783786204b..1e0e603837183af2fe391b5368dccb77b17240f1 100644 (file)
@@ -1,3 +1,7 @@
+2002-01-02  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.dg/template/ctor1.C: New test.
+
 2002-01-02  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.dg/template/friend2.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/ctor1.C b/gcc/testsuite/g++.dg/template/ctor1.C
new file mode 100644 (file)
index 0000000..ceae740
--- /dev/null
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com>
+
+// PR 5132. ICE on struct constructors in templates.
+
+// snippets from bits/huge_val.h
+
+#define __HUGE_VAL_bytes        { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f }
+#define __huge_val_t    union { unsigned char __c[8]; double __d; }
+#define HUGE_VAL       (__extension__ \
+  ((__huge_val_t) { __c: __HUGE_VAL_bytes }).__d)
+
+void foo( const int&) {
+  HUGE_VAL; // no problem here
+}
+
+template <class F>
+void Tfoo( const F&) {
+  HUGE_VAL; // g++ fails here
+}