typeck.c (build_c_cast): Do template processing earlier.

cp:
	* typeck.c (build_c_cast): Do template processing earlier.
	Always pedwarn on array casts.
testsuite:
	* g++.old-deja/g++.pt/cast2.C: New test.

From-SVN: r38941
This commit is contained in:
Nathan Sidwell 2001-01-12 09:47:23 +00:00 committed by Nathan Sidwell
parent 159227d5a8
commit 0949f72302
4 changed files with 50 additions and 10 deletions

View file

@ -1,3 +1,8 @@
2001-01-12 Nathan Sidwell <nathan@codesourcery.com>
* typeck.c (build_c_cast): Do template processing earlier.
Always pedwarn on array casts.
2001-01-12 Nathan Sidwell <nathan@codesourcery.com>
* friend.c (make_friend_class): Make sure a templated class is

View file

@ -5349,6 +5349,13 @@ build_c_cast (type, expr)
if (type == error_mark_node || expr == error_mark_node)
return error_mark_node;
if (processing_template_decl)
{
tree t = build_min (CAST_EXPR, type,
tree_cons (NULL_TREE, value, NULL_TREE));
return t;
}
/* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
if (TREE_CODE (type) != REFERENCE_TYPE
@ -5365,13 +5372,12 @@ build_c_cast (type, expr)
NIHCL uses it. It is not valid ISO C++ however. */
if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
{
if (pedantic)
pedwarn ("ISO C++ forbids casting to an array type");
cp_pedwarn ("ISO C++ forbids casting to an array type `%T'", type);
type = build_pointer_type (TREE_TYPE (type));
}
else
{
error ("ISO C++ forbids casting to an array type");
cp_error ("ISO C++ forbids casting to an array type `%T'", type);
return error_mark_node;
}
}
@ -5383,13 +5389,6 @@ build_c_cast (type, expr)
return error_mark_node;
}
if (processing_template_decl)
{
tree t = build_min (CAST_EXPR, type,
tree_cons (NULL_TREE, value, NULL_TREE));
return t;
}
if (TREE_CODE (type) == VOID_TYPE)
{
/* Conversion to void does not cause any of the normal function to

View file

@ -1,3 +1,7 @@
2001-01-12 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.pt/cast2.C: New test.
2001-01-12 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.pt/friend47.C: New test.

View file

@ -0,0 +1,32 @@
// Build don't link:
// Copyright (C) 2000 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 10 Jan 2001 <nathan@codesourcery.com>
// Bug 1588. We ICE'd on reparsing an absdcl as a cast inside a template
// function.
class A {
public:
template <class T> void f(void *CLUTp);
};
template <class T> void A::f(void *CLUTp)
{
void *CLUT;
CLUT = (unsigned char [3][256])CLUTp; // ERROR - cast to array
return;
}
int main()
{
A myobj;
unsigned char t[3][256];
myobj.f<unsigned char>(t);
return 0;
}