re PR c++/33464 (Broken diagnostic: 'trait_expr' not supported by dump_expr)

/cp
2007-09-18  Paolo Carlini  <pcarlini@suse.de>

	PR c++/33464
	* cxx-pretty-print.c (pp_cxx_trait_expression): Add.
	(pp_cxx_primary_expression): Use it.
	* cxx-pretty-print.h (pp_cxx_trait_expression): Declare.
	* error.c (dump_expr): Use it.

/testsuite
2007-09-18  Paolo Carlini  <pcarlini@suse.de>

	PR c++/33464
	* g++.dg/ext/is_class_error.C: Rename to is_class_error1.C.
	* g++.dg/ext/is_class_error2.C: New.

From-SVN: r128578
This commit is contained in:
Paolo Carlini 2007-09-18 14:35:42 +00:00 committed by Paolo Carlini
parent e2972de537
commit e74392f0a8
7 changed files with 139 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2007-09-18 Paolo Carlini <pcarlini@suse.de>
PR c++/33464
* cxx-pretty-print.c (pp_cxx_trait_expression): Add.
(pp_cxx_primary_expression): Use it.
* cxx-pretty-print.h (pp_cxx_trait_expression): Declare.
* error.c (dump_expr): Use it.
2007-09-16 Paolo Carlini <pcarlini@suse.de>
PR c++/33124

View File

@ -348,7 +348,26 @@ pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
:: operator-function-id
:: qualifier-id
( expression )
id-expression */
id-expression
GNU Extensions:
__has_nothrow_assign ( type-id )
__has_nothrow_constructor ( type-id )
__has_nothrow_copy ( type-id )
__has_trivial_assign ( type-id )
__has_trivial_constructor ( type-id )
__has_trivial_copy ( type-id )
__has_trivial_destructor ( type-id )
__has_virtual_destructor ( type-id )
__is_abstract ( type-id )
__is_base_of ( type-id , type-id )
__is_class ( type-id )
__is_convertible_to ( type-id , type-id )
__is_empty ( type-id )
__is_enum ( type-id )
__is_pod ( type-id )
__is_polymorphic ( type-id )
__is_union ( type-id ) */
static void
pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
@ -387,6 +406,10 @@ pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
pp_cxx_right_paren (pp);
break;
case TRAIT_EXPR:
pp_cxx_trait_expression (pp, t);
break;
default:
pp_c_primary_expression (pp_c_base (pp), t);
break;
@ -2123,6 +2146,80 @@ pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
}
}
void
pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
{
cp_trait_kind kind = TRAIT_EXPR_KIND (t);
switch (kind)
{
case CPTK_HAS_NOTHROW_ASSIGN:
pp_cxx_identifier (pp, "__has_nothrow_assign");
break;
case CPTK_HAS_TRIVIAL_ASSIGN:
pp_cxx_identifier (pp, "__has_trivial_assign");
break;
case CPTK_HAS_NOTHROW_CONSTRUCTOR:
pp_cxx_identifier (pp, "__has_nothrow_constructor");
break;
case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
pp_cxx_identifier (pp, "__has_trivial_constructor");
break;
case CPTK_HAS_NOTHROW_COPY:
pp_cxx_identifier (pp, "__has_nothrow_copy");
break;
case CPTK_HAS_TRIVIAL_COPY:
pp_cxx_identifier (pp, "__has_trivial_copy");
break;
case CPTK_HAS_TRIVIAL_DESTRUCTOR:
pp_cxx_identifier (pp, "__has_trivial_destructor");
break;
case CPTK_HAS_VIRTUAL_DESTRUCTOR:
pp_cxx_identifier (pp, "__has_virtual_destructor");
break;
case CPTK_IS_ABSTRACT:
pp_cxx_identifier (pp, "__is_abstract");
break;
case CPTK_IS_BASE_OF:
pp_cxx_identifier (pp, "__is_base_of");
break;
case CPTK_IS_CLASS:
pp_cxx_identifier (pp, "__is_class");
break;
case CPTK_IS_CONVERTIBLE_TO:
pp_cxx_identifier (pp, "__is_convertible_to");
break;
case CPTK_IS_EMPTY:
pp_cxx_identifier (pp, "__is_empty");
break;
case CPTK_IS_ENUM:
pp_cxx_identifier (pp, "__is_enum");
break;
case CPTK_IS_POD:
pp_cxx_identifier (pp, "__is_pod");
break;
case CPTK_IS_POLYMORPHIC:
pp_cxx_identifier (pp, "__is_polymorphic");
break;
case CPTK_IS_UNION:
pp_cxx_identifier (pp, "__is_union");
break;
default:
gcc_unreachable ();
}
pp_cxx_left_paren (pp);
pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
{
pp_cxx_separate_with (pp, ',');
pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
}
pp_cxx_right_paren (pp);
}
typedef c_pretty_print_fn pp_fun;

View File

@ -69,6 +69,6 @@ void pp_cxx_separate_with (cxx_pretty_printer *, int);
void pp_cxx_declaration (cxx_pretty_printer *, tree);
void pp_cxx_canonical_template_parameter (cxx_pretty_printer *, tree);
void pp_cxx_trait_expression (cxx_pretty_printer *, tree);
#endif /* GCC_CXX_PRETTY_PRINT_H */

View File

@ -2054,6 +2054,10 @@ dump_expr (tree t, int flags)
dump_type (t, flags);
break;
case TRAIT_EXPR:
pp_cxx_trait_expression (cxx_pp, t);
break;
/* This list is incomplete, but should suffice for now.
It is very important that `sorry' does not call
`report_error_function'. That could cause an infinite loop. */

View File

@ -1,3 +1,9 @@
2007-09-18 Paolo Carlini <pcarlini@suse.de>
PR c++/33464
* g++.dg/ext/is_class_error.C: Rename to is_class_error1.C.
* g++.dg/ext/is_class_error2.C: New.
2007-09-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/33340

View File

@ -0,0 +1,22 @@
// PR c++/33464
template<int> void foo()
{
__has_nothrow_assign(int)(); // { dg-error "'__has_nothrow_assign\\(int\\)' cannot be used" }
__has_trivial_assign(int)(); // { dg-error "'__has_trivial_assign\\(int\\)' cannot be used" }
__has_nothrow_constructor(int)(); // { dg-error "'__has_nothrow_constructor\\(int\\)' cannot be used" }
__has_trivial_constructor(int)(); // { dg-error "'__has_trivial_constructor\\(int\\)' cannot be used" }
__has_nothrow_copy(int)(); // { dg-error "'__has_nothrow_copy\\(int\\)' cannot be used" }
__has_trivial_copy(int)(); // { dg-error "'__has_trivial_copy\\(int\\)' cannot be used" }
__has_trivial_destructor(int)(); // { dg-error "'__has_trivial_destructor\\(int\\)' cannot be used" }
__has_virtual_destructor(int)(); // { dg-error "'__has_virtual_destructor\\(int\\)' cannot be used" }
__is_abstract(int)(); // { dg-error "'__is_abstract\\(int\\)' cannot be used" }
__is_base_of(int, float)(); // { dg-error "'__is_base_of\\(int, float\\)' cannot be used" }
__is_class(int)(); // { dg-error "'__is_class\\(int\\)' cannot be used" }
__is_convertible_to(int, float)(); // { dg-error "unimplemented" }
__is_empty(int)(); // { dg-error "'__is_empty\\(int\\)' cannot be used" }
__is_enum(int)(); // { dg-error "'__is_enum\\(int\\)' cannot be used" }
__is_pod(int)(); // { dg-error "'__is_pod\\(int\\)' cannot be used" }
__is_polymorphic(int)(); // { dg-error "'__is_polymorphic\\(int\\)' cannot be used" }
__is_union(int)(); // { dg-error "'__is_union\\(int\\)' cannot be used" }
}