diff options
author | Paolo Carlini <pcarlini@suse.de> | 2007-09-18 14:35:42 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2007-09-18 14:35:42 +0000 |
commit | e74392f0a8f7e617180f5bc034ff4c12b5fa8405 (patch) | |
tree | 5be54ba711fa5c187ecc10d930f60b988e4e7f1c | |
parent | e2972de5377c352200a84c0f3055b099631f3dbc (diff) | |
download | gcc-e74392f0a8f7e617180f5bc034ff4c12b5fa8405.zip gcc-e74392f0a8f7e617180f5bc034ff4c12b5fa8405.tar.gz gcc-e74392f0a8f7e617180f5bc034ff4c12b5fa8405.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cxx-pretty-print.c | 99 | ||||
-rw-r--r-- | gcc/cp/cxx-pretty-print.h | 2 | ||||
-rw-r--r-- | gcc/cp/error.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/is_class_error1.C (renamed from gcc/testsuite/g++.dg/ext/is_class_error.C) | 0 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/is_class_error2.C | 22 |
7 files changed, 139 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index aa4659f..c0610b0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index 4bdd19d..156f579 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -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; diff --git a/gcc/cp/cxx-pretty-print.h b/gcc/cp/cxx-pretty-print.h index 7acf7b5..2ae834f 100644 --- a/gcc/cp/cxx-pretty-print.h +++ b/gcc/cp/cxx-pretty-print.h @@ -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 */ diff --git a/gcc/cp/error.c b/gcc/cp/error.c index d6675f0..b68df74 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3437101..882780f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/ext/is_class_error.C b/gcc/testsuite/g++.dg/ext/is_class_error1.C index d037ec7..d037ec7 100644 --- a/gcc/testsuite/g++.dg/ext/is_class_error.C +++ b/gcc/testsuite/g++.dg/ext/is_class_error1.C diff --git a/gcc/testsuite/g++.dg/ext/is_class_error2.C b/gcc/testsuite/g++.dg/ext/is_class_error2.C new file mode 100644 index 0000000..9f19d62 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_class_error2.C @@ -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" } +} |