diff options
author | Martin Sebor <msebor@redhat.com> | 2016-05-03 21:15:28 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2016-05-03 15:15:28 -0600 |
commit | b25aad5fda6c3efbb83980fb0f4fb0e2ddd38216 (patch) | |
tree | 0909668e48da930feebd5b9147810cbe08e38f6c /gcc/builtins.c | |
parent | 9663f8f74821638d2f2ef1a333ec4e937c3c6040 (diff) | |
download | gcc-b25aad5fda6c3efbb83980fb0f4fb0e2ddd38216.zip gcc-b25aad5fda6c3efbb83980fb0f4fb0e2ddd38216.tar.gz gcc-b25aad5fda6c3efbb83980fb0f4fb0e2ddd38216.tar.bz2 |
PR c++/66561 - __builtin_LINE at al. should yield constant expressions
PR c++/66561 - __builtin_LINE at al. should yield constant expressions
PR c++/66639 - declare __func__, __FUNCTION__ & __PRETTY_FUNCTION__ constexpr
gcc/testsuite/ChangeLog:
2016-05-03 Martin Sebor <msebor@redhat.com>
PR c++/66561
* c-c++-common/builtin_location.c: New test.
* g++.dg/cpp1y/builtin_location.C: New test.
gcc/cp/ChangeLog:
2016-05-03 Martin Sebor <msebor@redhat.com>
PR c++/66561
* tree.c (builtin_valid_in_constant_expr_p): Treat BUILT_IN_FILE,
BUILT_IN_FUNCTION, and BUILT_IN_LINE as constant expressions.
gcc/ChangeLog:
2016-05-03 Martin Sebor <msebor@redhat.com>
PR c++/66561
* builtins.c (fold_builtin_FILE): New function.
(fold_builtin_FUNCTION, fold_builtin_LINE): New functions.
(fold_builtin_0): Call them.
* gimplify.c (gimplify_call_expr): Remove the handling of
BUILT_IN_FILE, BUILT_IN_FUNCTION, and BUILT_IN_LINE.
PR c++/66561
* doc/extend.texi (Other Builtins): Update __builtin_FILE,
__builtin_FUNCTION, and __builtin_LINE to reflect they yield
constants.
PR c++/66639
* doc/extend.texi (Function Names as Strings): Update __func__,
__FUNCTION__, __PRETTY_FUNCTION__ to reflect they evaluate to
constants.
From-SVN: r235845
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 7d87619..476feb1 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -8011,6 +8011,39 @@ fold_builtin_arith_overflow (location_t loc, enum built_in_function fcode, return build2_loc (loc, COMPOUND_EXPR, boolean_type_node, store, ovfres); } +/* Fold a call to __builtin_FILE to a constant string. */ + +static inline tree +fold_builtin_FILE (location_t loc) +{ + if (const char *fname = LOCATION_FILE (loc)) + return build_string_literal (strlen (fname) + 1, fname); + + return build_string_literal (1, ""); +} + +/* Fold a call to __builtin_FUNCTION to a constant string. */ + +static inline tree +fold_builtin_FUNCTION () +{ + if (current_function_decl) + { + const char *name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl)); + return build_string_literal (strlen (name) + 1, name); + } + + return build_string_literal (1, ""); +} + +/* Fold a call to __builtin_LINE to an integer constant. */ + +static inline tree +fold_builtin_LINE (location_t loc, tree type) +{ + return build_int_cst (type, LOCATION_LINE (loc)); +} + /* Fold a call to built-in function FNDECL with 0 arguments. This function returns NULL_TREE if no simplification was possible. */ @@ -8021,6 +8054,15 @@ fold_builtin_0 (location_t loc, tree fndecl) enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl); switch (fcode) { + case BUILT_IN_FILE: + return fold_builtin_FILE (loc); + + case BUILT_IN_FUNCTION: + return fold_builtin_FUNCTION (); + + case BUILT_IN_LINE: + return fold_builtin_LINE (loc, type); + CASE_FLT_FN (BUILT_IN_INF): case BUILT_IN_INFD32: case BUILT_IN_INFD64: |