diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-10-25 10:47:15 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-10-25 10:47:15 +0200 |
commit | e16f1cc79dc131b0762cec4c18cfcd795fb6fe75 (patch) | |
tree | 2d1523ca1b3160a1e7eafa9814f6a920b91ac43e /gcc/cp/semantics.c | |
parent | 080c5459776a70bf6dc9c3410361011591667951 (diff) | |
download | gcc-e16f1cc79dc131b0762cec4c18cfcd795fb6fe75.zip gcc-e16f1cc79dc131b0762cec4c18cfcd795fb6fe75.tar.gz gcc-e16f1cc79dc131b0762cec4c18cfcd795fb6fe75.tar.bz2 |
internal-fn.def (LAUNDER): New internal function.
* internal-fn.def (LAUNDER): New internal function.
* internal-fn.c (expand_LAUNDER): New function.
c-family/
* c-common.h (enum rid): Add RID_BUILTIN_LAUNDER.
* c-common.c (c_common_reswords): Add __builtin_launder.
cp/
* cp-tree.h (finish_builtin_launder): Declare.
* parser.c (cp_parser_postfix_expression): Handle RID_BUILTIN_LAUNDER.
* semantics.c (finish_builtin_launder): New function.
* pt.c (tsubst_copy_and_build): Handle instantiation of IFN_LAUNDER.
* constexpr.c (cxx_eval_internal_function): Handle IFN_LAUNDER.
(potential_constant_expression_1): Likewise.
testsuite/
* g++.dg/cpp1z/launder1.C: New test.
* g++.dg/cpp1z/launder2.C: New test.
From-SVN: r241506
Diffstat (limited to 'gcc/cp/semantics.c')
-rw-r--r-- | gcc/cp/semantics.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 968f88b..1a7c478 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9449,4 +9449,26 @@ finish_binary_fold_expr (tree expr1, tree expr2, int op) return error_mark_node; } +/* Finish __builtin_launder (arg). */ + +tree +finish_builtin_launder (location_t loc, tree arg, tsubst_flags_t complain) +{ + tree orig_arg = arg; + if (!type_dependent_expression_p (arg)) + arg = decay_conversion (arg, complain); + if (error_operand_p (arg)) + return error_mark_node; + if (!type_dependent_expression_p (arg) + && TREE_CODE (TREE_TYPE (arg)) != POINTER_TYPE) + { + error_at (loc, "non-pointer argument to %<__builtin_launder%>"); + return error_mark_node; + } + if (processing_template_decl) + arg = orig_arg; + return build_call_expr_internal_loc (loc, IFN_LAUNDER, + TREE_TYPE (arg), 1, arg); +} + #include "gt-cp-semantics.h" |