re PR c++/29733 (ICE on initialization of function type)
PR c++/29733 * pt.c (tsubst_decl): Disallow variables of function type. PR c++/29733 * g++.dg/template/crash61.C: New test. From-SVN: r119500
This commit is contained in:
parent
7b5d1e2736
commit
2c05d05ede
4 changed files with 38 additions and 0 deletions
|
@ -1,5 +1,8 @@
|
|||
2006-12-04 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/29733
|
||||
* pt.c (tsubst_decl): Disallow variables of function type.
|
||||
|
||||
PR c++/29632
|
||||
* call.c (add_builtin_candidate): Do not permit NULL pointer
|
||||
constants to be compared with template parameters.
|
||||
|
|
21
gcc/cp/pt.c
21
gcc/cp/pt.c
|
@ -6954,6 +6954,27 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
|
|||
type = tsubst (TREE_TYPE (t), args, complain, in_decl);
|
||||
if (type == error_mark_node)
|
||||
return error_mark_node;
|
||||
if (TREE_CODE (type) == FUNCTION_TYPE)
|
||||
{
|
||||
/* It may seem that this case cannot occur, since:
|
||||
|
||||
typedef void f();
|
||||
void g() { f x; }
|
||||
|
||||
declares a function, not a variable. However:
|
||||
|
||||
typedef void f();
|
||||
template <typename T> void g() { T t; }
|
||||
template void g<f>();
|
||||
|
||||
is an attempt to declare a variable with function
|
||||
type. */
|
||||
error ("variable %qD has function type",
|
||||
/* R is not yet sufficiently initialized, so we
|
||||
just use its name. */
|
||||
DECL_NAME (r));
|
||||
return error_mark_node;
|
||||
}
|
||||
type = complete_type (type);
|
||||
DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (r)
|
||||
= DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (t);
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2006-12-04 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/29733
|
||||
* g++.dg/template/crash61.C: New test.
|
||||
|
||||
PR c++/29632
|
||||
* g++.dg/template/error23.C: New test.
|
||||
|
||||
|
|
11
gcc/testsuite/g++.dg/template/crash61.C
Normal file
11
gcc/testsuite/g++.dg/template/crash61.C
Normal file
|
@ -0,0 +1,11 @@
|
|||
// PR c++/29733
|
||||
|
||||
template<typename T> void foo()
|
||||
{
|
||||
T t = 0; // { dg-error "function type" }
|
||||
}
|
||||
|
||||
void bar()
|
||||
{
|
||||
foo<int()>();
|
||||
}
|
Loading…
Add table
Reference in a new issue