diff options
author | Douglas Gregor <doug.gregor@gmail.com> | 2007-07-27 17:43:05 +0000 |
---|---|---|
committer | Doug Gregor <dgregor@gcc.gnu.org> | 2007-07-27 17:43:05 +0000 |
commit | 3ad6a8e12ca4ac15b759f6a407d2ca2ea32e17a2 (patch) | |
tree | 1fd8c965b4122258e1d88e04db3ecb09a3757908 /gcc/cp/pt.c | |
parent | 8a67955f0815ecf2892c635ca4128a5f414eb507 (diff) | |
download | gcc-3ad6a8e12ca4ac15b759f6a407d2ca2ea32e17a2.zip gcc-3ad6a8e12ca4ac15b759f6a407d2ca2ea32e17a2.tar.gz gcc-3ad6a8e12ca4ac15b759f6a407d2ca2ea32e17a2.tar.bz2 |
typeck.c (structural_comptypes): Compare DECLTYPE_TYPE nodes.
2007-07-27 Douglas Gregor <doug.gregor@gmail.com>
* typeck.c (structural_comptypes): Compare DECLTYPE_TYPE nodes.
* cp-tree.def (DECLTYPE_TYPE): New.
* error.c (dump_type): Dump DECLTYPE_TYPE nodes.
(dump_type_prefix): Ditto.
(dump_type_suffix): Ditto.
* tree.c (DECLTYPE_TYPE): Walk DECLTYPE_TYPE nodes.
* mangle.c (write_type): Handle DECLTYPE_TYPE.
* cp-tree.h (IS_AGGR_TYPE): DECLTYPE_TYPE nodes can be aggregate
types.
(DECLTYPE_TYPE_EXPR): New.
(DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P): New.
(finish_declared_type): Declare.
* cxx-pretty-print.c (pp_cxx_type_specifier_seq): Print
DECLTYPE_TYPE nodes.
(pp_cxx_type_id): Ditto.
* pt.c (for_each_template_parm_r): Walk DECLTYPE_TYPE children.
(tsubst): Substitute into a DECLTYPE_TYPE node.
(tsubst_copy): Ditto.
(unify): Cannot deduce anything from TYPEOF_TYPE or DECLTYPE_TYPE
nodes.
(dependent_type_p_r): DECLTYPE_TYPE types are always dependent.
* semantics.c (finish_typeof): TYPEOF_TYPE types need to use
structural equality (because we can't hash the expressions).
(finish_declared_type): New.
* lex.c (reswords): Add "decltype" keyword.
* parser.c cp_lexer_next_token_is_decl_specifier_keyword
(cp_parser_postfix_expression): Add member_access_only_p to
restrict postfix expression to member access expressions.
(cp_parser_unary_expression): Update call to
cp_parser_postfix_expression to reflect new parameter.
(cp_parser_declared_type): New.
(cp_parser_simple_type_specifier): Parse decltype types.
2007-07-27 Douglas Gregor <doug.gregor@gmail.com>
* c-common.h (enum rid): Add RID_DECLTYPE, update RID_LAST_CXX0X.
2007-07-27 Douglas Gregor <doug.gregor@gmail.com>
* g++.dg/cpp0x/decltype1.C: New.
* g++.dg/cpp0x/decltype2.C: New.
* g++.dg/cpp0x/decltype3.C: New.
* g++.dg/cpp0x/decltype4.C: New.
* g++.dg/cpp0x/decltype5.C: New.
* g++.dg/cpp0x/decltype6.C: New.
From-SVN: r126991
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index fc5af16..d05bfd2 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9058,6 +9058,22 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) complain); } + case DECLTYPE_TYPE: + { + tree type; + + type = + finish_decltype_type (tsubst_expr + (DECLTYPE_TYPE_EXPR (t), args, + complain, in_decl, + /*integral_constant_expression_p=*/false), + DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t)); + return cp_build_qualified_type_real (type, + cp_type_quals (t) + | cp_type_quals (type), + complain); + } + case TYPE_ARGUMENT_PACK: case NONTYPE_ARGUMENT_PACK: { @@ -9621,6 +9637,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) case TYPENAME_TYPE: case UNBOUND_CLASS_TEMPLATE: case TYPEOF_TYPE: + case DECLTYPE_TYPE: case TYPE_DECL: return tsubst (t, args, complain, in_decl); @@ -12824,6 +12841,12 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict) break; + case TYPEOF_TYPE: + case DECLTYPE_TYPE: + /* Cannot deduce anything from TYPEOF_TYPE or DECLTYPE_TYPE + nodes. */ + return 0; + default: gcc_assert (EXPR_P (parm)); @@ -14888,10 +14911,11 @@ dependent_type_p_r (tree type) (INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (type))))) return true; - /* All TYPEOF_TYPEs are dependent; if the argument of the `typeof' - expression is not type-dependent, then it should already been - have resolved. */ - if (TREE_CODE (type) == TYPEOF_TYPE) + /* All TYPEOF_TYPEs and DECLTYPE_TYPEs are dependent; if the + argument of the `typeof' expression is not type-dependent, then + it should already been have resolved. */ + if (TREE_CODE (type) == TYPEOF_TYPE + || TREE_CODE (type) == DECLTYPE_TYPE) return true; /* A template argument pack is dependent if any of its packed |