aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/semantics.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2016-10-25 10:47:15 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-10-25 10:47:15 +0200
commite16f1cc79dc131b0762cec4c18cfcd795fb6fe75 (patch)
tree2d1523ca1b3160a1e7eafa9814f6a920b91ac43e /gcc/cp/semantics.c
parent080c5459776a70bf6dc9c3410361011591667951 (diff)
downloadgcc-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.c22
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"