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:
parent
e2972de537
commit
e74392f0a8
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
|
22
gcc/testsuite/g++.dg/ext/is_class_error2.C
Normal file
22
gcc/testsuite/g++.dg/ext/is_class_error2.C
Normal 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" }
|
||||
}
|
Loading…
Reference in New Issue
Block a user