re PR c++/5132 (NaN = 0.0 * HUGE_VAL fails to compile in templates)

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
This commit is contained in:
Nathan Sidwell 2002-01-02 11:29:15 +00:00 committed by Nathan Sidwell
parent 477558bf39
commit 903c623438
4 changed files with 42 additions and 6 deletions

View 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

View 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);
}
}
}

View 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.

View File

@ -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
}