aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-10-19 22:48:51 -0400
committerJason Merrill <jason@gcc.gnu.org>2015-10-19 22:48:51 -0400
commit2a9fb7125e0b0e73cc36ebbff607aa03d6e02ea4 (patch)
treece34d7922020e02b9e9d7346c70ded9a6f9f13c7 /gcc/cp/parser.c
parentdcdbc004d531b43e0583f8ac18def1474d64dc05 (diff)
downloadgcc-2a9fb7125e0b0e73cc36ebbff607aa03d6e02ea4.zip
gcc-2a9fb7125e0b0e73cc36ebbff607aa03d6e02ea4.tar.gz
gcc-2a9fb7125e0b0e73cc36ebbff607aa03d6e02ea4.tar.bz2
Implement N4268, Do constant evaluation of all non-type template args.
gcc/c-family/ * c-cppbuiltin.c (c_cpp_builtins): Define __cpp_nontype_template_args. gcc/cp/ * parser.c (cp_parser_template_argument): For C++1z just parse a constant-expression. * pt.c (convert_nontype_argument): For C++1z always call maybe_constant_value. From-SVN: r229019
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r--gcc/cp/parser.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 435757d..f07a5e4 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -14977,8 +14977,12 @@ cp_parser_template_argument (cp_parser* parser)
warn_deprecated_use (argument, NULL_TREE);
return argument;
}
- /* It must be a non-type argument. There permitted cases are given
- in [temp.arg.nontype]:
+ /* It must be a non-type argument. In C++17 any constant-expression is
+ allowed. */
+ if (cxx_dialect > cxx14)
+ goto general_expr;
+
+ /* Otherwise, the permitted cases are given in [temp.arg.nontype]:
-- an integral constant-expression of integral or enumeration
type; or
@@ -15090,6 +15094,7 @@ cp_parser_template_argument (cp_parser* parser)
return error_mark_node;
}
+ general_expr:
/* If the argument wasn't successfully parsed as a type-id followed
by '>>', the argument can only be a constant expression now.
Otherwise, we try parsing the constant-expression tentatively,