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:
parent
159227d5a8
commit
0949f72302
4 changed files with 50 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
32
gcc/testsuite/g++.old-deja/g++.pt/cast2.C
Normal file
32
gcc/testsuite/g++.old-deja/g++.pt/cast2.C
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue