[PATCH][C++] Fix PR65091
Hi all, please find attached a fix for pr 65071 decltype(~arg) fails for template functions. Basically we need to make sure that ~arg is considered an expression and not a dtor. 2015-02-21 Andrea Azzarone azzaro...@gmail.com PR c++/65091 * parser.c (cp_parser_decltype_expr): Make sure ~id is treated as an expression. -- Andrea Azzarone Index: gcc/cp/parser.c === --- gcc/cp/parser.c (revision 220698) +++ gcc/cp/parser.c (working copy) @@ -12236,7 +12236,10 @@ cp_parser_decltype_expr (cp_parser *pars /*declarator_p=*/false, /*optional_p=*/false); - if (!cp_parser_error_occurred (parser) expr != error_mark_node) + if (!cp_parser_error_occurred (parser) + expr + expr != error_mark_node + (TREE_CODE (expr) != BIT_NOT_EXPR || TYPE_P (TREE_OPERAND (expr, 0 { bool non_integral_constant_expression_p = false; tree id_expression = expr; Index: gcc/testsuite/g++.dg/cpp0x/trailing10.C === --- gcc/testsuite/g++.dg/cpp0x/trailing10.C (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/trailing10.C (working copy) @@ -0,0 +1,11 @@ +// PR c++/65091 +// { dg-do compile { target c++11 } } + +templatetypename T +auto foo(T x) - decltype(~x) { + return ~x; +} + +int bar() { + return foo(10); +}
Re: PATCH for c++/64948
Ping? 2015-02-13 15:51 GMT+01:00 Andrea Azzarone azzaro...@gmail.com: Hi all, this patch try to fix PR c++/64948 (Lambda reference capture initialization in template function creates segmentation fault). 2015-2-13 Andrea Azzarone azzaro...@gmail.com PR c++/64948 * lambda.c (add_capture) Do not consider as rvalues all expressions involving template parameters. -- Andrea Azzarone -- Andrea Azzarone http://launchpad.net/~andyrock http://wiki.ubuntu.com/AndreaAzzarone
Re: [PATCH][C++] PR 65071
Ops, forgot the diff. 2015-02-18 9:19 GMT+01:00 Andrea Azzarone azzaro...@gmail.com: Hi all, this patch try to fix PR c++/65071 (ICE on valid, sizeof...() of template template parameter pack in return type). 2015-2-18 Andrea Azzarone azzaro...@gmail.com PR c++/65071 * gcc/cp/parser.c (cp_parser_sizeof_pack) Also consider template template parameters. Thanks. -- Andrea Azzarone -- Andrea Azzarone http://launchpad.net/~andyrock http://wiki.ubuntu.com/AndreaAzzarone Index: gcc/cp/parser.c === --- gcc/cp/parser.c (revision 220698) +++ gcc/cp/parser.c (working copy) @@ -24369,7 +24369,7 @@ cp_parser_sizeof_pack (cp_parser *parser if (expr == error_mark_node) cp_parser_name_lookup_error (parser, name, expr, NLE_NULL, token-location); - if (TREE_CODE (expr) == TYPE_DECL) + if (TREE_CODE (expr) == TYPE_DECL || TREE_CODE (expr) == TEMPLATE_DECL) expr = TREE_TYPE (expr); else if (TREE_CODE (expr) == CONST_DECL) expr = DECL_INITIAL (expr); Index: gcc/testsuite/g++.dg/cpp0x/vt-65071.C === --- gcc/testsuite/g++.dg/cpp0x/vt-65071.C (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/vt-65071.C (working copy) @@ -0,0 +1,9 @@ +// PR c++/65071 +// { dg-do compile { target c++11 } } + +templateint struct S {}; + +templatetemplateint class... T, int N +Ssizeof...(T) foo(TN...); + +auto x = foo(S2{});
[PATCH][C++] PR 65071
Hi all, this patch try to fix PR c++/65071 (ICE on valid, sizeof...() of template template parameter pack in return type). 2015-2-18 Andrea Azzarone azzaro...@gmail.com PR c++/65071 * gcc/cp/parser.c (cp_parser_sizeof_pack) Also consider template template parameters. Thanks. -- Andrea Azzarone
PATCH for c++/64948
Hi all, this patch try to fix PR c++/64948 (Lambda reference capture initialization in template function creates segmentation fault). 2015-2-13 Andrea Azzarone azzaro...@gmail.com PR c++/64948 * lambda.c (add_capture) Do not consider as rvalues all expressions involving template parameters. -- Andrea Azzarone Index: gcc/cp/lambda.c === --- gcc/cp/lambda.c (revision 220454) +++ gcc/cp/lambda.c (working copy) @@ -506,7 +506,7 @@ add_capture (tree lambda, tree id, tree if (by_reference_p) { type = build_reference_type (type); - if (!real_lvalue_p (initializer)) + if (TREE_TYPE (initializer) !real_lvalue_p (initializer)) error (cannot capture %qE by reference, initializer); } else Index: gcc/testsuite/g++.dg/cpp1y/lambda-init13.C === --- gcc/testsuite/g++.dg/cpp1y/lambda-init13.C (revision 0) +++ gcc/testsuite/g++.dg/cpp1y/lambda-init13.C (working copy) @@ -0,0 +1,10 @@ +// PR c++/64948 +// { dg-do compile { target c++14 } } + +template class T +void foo(T t) { + [i = t.begin()]() {}; +} + +int main() { +} Index: gcc/testsuite/g++.dg/cpp1y/lambda-init14.C === --- gcc/testsuite/g++.dg/cpp1y/lambda-init14.C (revision 0) +++ gcc/testsuite/g++.dg/cpp1y/lambda-init14.C (working copy) @@ -0,0 +1,16 @@ +// PR c++/64948 +// { dg-do compile { target c++14 } } + +template class T +void foo(T t) { + [i = t.begin()]() {}; // { dg-error invalid initialization } +} + +struct X { + int begin() { return 0; } +}; + +int main() { + X x; + foo(x); +}
Re: [PATCH] PR64959: SFINAE in UDLs
We can use the same trick used in the other tests. Patch attached. Sorry about that! 2015-02-13 20:45 GMT+01:00 Jakub Jelinek ja...@redhat.com: On Wed, Feb 11, 2015 at 12:26:33AM +0100, Andrea Azzarone wrote: * gcc/testsuite/g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C: This fails on i686-linux: FAIL: g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C -std=c++14 (test for excess errors) Excess errors: /home/jakub/src/gcc/gcc/testsuite/g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C:10:51: error: 'int operator_script(const char*, long unsigned int)' has invalid argument list Perhaps you meant to #include cstddef too and use size_t instead of unsigned long? Or just __SIZE_TYPE__ instead of unsigned long? Jakub -- Andrea Azzarone http://launchpad.net/~andyrock http://wiki.ubuntu.com/AndreaAzzarone Index: gcc/testsuite/g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C === --- gcc/testsuite/g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C (revision 220698) +++ gcc/testsuite/g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C (working copy) @@ -2,12 +2,14 @@ #include cassert +typedef decltype(sizeof(0)) size_type; + templatetypename CharT, CharT... String int operator _script () { return 1; } -int operator _script (const char*, unsigned long) { +int operator _script (const char*, size_type) { return 2; }
[C++] [PATCH] - Nested namespace defintions
Hi all, would be nice to have nested namespace definitions in gcc. I'm not sure if this if it's possible to merge stuff like this at this stage. 2015-2-13 Andrea Azzarone azzaro...@gmail.com PR c++/65047 * gcc/cp/cp-tree.h Declare maybe_warn_cpp1z. * gcc/cp/error.c Define maybe_warn_cpp1z. * gcc/cp/parser.c (cp_parser_namespace_definition) Add support for nested namespace definitions. I did a full boostrap + full make check. Thanks. -- Andrea Azzarone Index: gcc/cp/cp-tree.h === --- gcc/cp/cp-tree.h(revision 220454) +++ gcc/cp/cp-tree.h(working copy) @@ -467,6 +467,13 @@ typedef enum cpp0x_warn_str CPP0X_REF_QUALIFIER } cpp0x_warn_str; +/* The various kinds of C++1z warnings we ecounter. */ +typedef enum cpp1z_warn_str +{ + /* nested namespace definitions. */ + CPP1Z_NESTED_NAMESPACE_DEFINITIONS +} cpp1z_warn_str; + /* The various kinds of operation used by composite_pointer_type. */ typedef enum composite_pointer_operation @@ -5518,6 +5525,7 @@ extern const char *language_to_string ( extern const char *class_key_or_enum_as_string (tree); extern void maybe_warn_variadic_templates (void); extern void maybe_warn_cpp0x (cpp0x_warn_str str); +extern void maybe_warn_cpp1z (cpp1z_warn_str str); extern bool pedwarn_cxx98 (location_t, int, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4); extern location_t location_of (tree); extern void qualified_name_lookup_error(tree, tree, tree, Index: gcc/cp/error.c === --- gcc/cp/error.c (revision 220454) +++ gcc/cp/error.c (working copy) @@ -3611,6 +3611,24 @@ maybe_warn_cpp0x (cpp0x_warn_str str) } } +void +maybe_warn_cpp1z (cpp1z_warn_str str) +{ + if (cxx_dialect = cxx1z) +return; + + switch (str) +{ +case CPP1Z_NESTED_NAMESPACE_DEFINITIONS: + pedwarn (input_location, 0, + nested namespace definitions + only available with -std=c++1z or -std=gnu=c++1z); + break; +default: + gcc_unreachable (); +} +} + /* Warn about the use of variadic templates when appropriate. */ void maybe_warn_variadic_templates (void) Index: gcc/cp/parser.c === --- gcc/cp/parser.c (revision 220454) +++ gcc/cp/parser.c (working copy) @@ -16169,6 +16169,7 @@ cp_parser_namespace_name (cp_parser* par namespace-definition: named-namespace-definition unnamed-namespace-definition + nested-namespace-definition named-namespace-definition: original-namespace-definition @@ -16181,24 +16182,32 @@ cp_parser_namespace_name (cp_parser* par namespace original-namespace-name { namespace-body } unnamed-namespace-definition: - namespace { namespace-body } */ + namespace { namespace-body } + + nested-namespace-definition: + namespace enclosing-namespace-specifier :: identifier { namespace-body } + + enclosing-namespace-specifier: + identifier + enclosing-namespace-specifier :: identifier */ static void cp_parser_namespace_definition (cp_parser* parser) { + vectree, va_heap extra_identifiers; tree identifier, attribs; bool has_visibility; - bool is_inline; + location_t inline_location; + unsigned ns_deepness; cp_ensure_no_omp_declare_simd (parser); if (cp_lexer_next_token_is_keyword (parser-lexer, RID_INLINE)) { maybe_warn_cpp0x (CPP0X_INLINE_NAMESPACES); - is_inline = true; - cp_lexer_consume_token (parser-lexer); + inline_location = cp_lexer_consume_token (parser-lexer)-location; } else -is_inline = false; +inline_location = UNKNOWN_LOCATION; /* Look for the `namespace' keyword. */ cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE); @@ -16207,22 +16216,64 @@ cp_parser_namespace_definition (cp_parse between an original-namespace-definition and an extension-namespace-definition at this point. The semantic analysis routines are responsible for that. */ + extra_identifiers.create(0); if (cp_lexer_next_token_is (parser-lexer, CPP_NAME)) -identifier = cp_parser_identifier (parser); +{ + /* named-namespace-definition. */ + identifier = cp_parser_identifier (parser); + + while (cp_lexer_next_token_is (parser-lexer, CPP_SCOPE) + cp_lexer_peek_nth_token (parser-lexer, 2)-type == CPP_NAME) + { + /* nested-namespace-definition */ + cp_lexer_consume_token (parser-lexer); + extra_identifiers.safe_insert (0, cp_parser_identifier (parser)); + } +} else -identifier = NULL_TREE; +{ + /* unnamed-namespace-definition. */ + identifier = NULL_TREE; +} + + if (!extra_identifiers.is_empty ()) +maybe_warn_cpp1z
Re: [PATCH] PR64959: SFINAE in UDLs
Hi, Thanks for the review. I updated the patch. 2015-2-9 Andrea Azzarone azzaro...@gmail.com PR c++/64959 * parser.c (lookup_literal_operator): Return all candidates. (cp_parser_userdef_char_literal): Simplify error handling. (cp_parser_userdef_numeric_literal): Pass tf_warning_or_error. (cp_parser_userdef_string_literal): Pass tf_warning_or_error. Also give higher priority to standard string UDL operator. * gcc/testsuite/g++.dg/cpp0x/udlit-namespace-ambiguous.C: Added test case to make sure gcc detects ambiguous UDL declarations. * gcc/testsuite/g++.dg/cpp0x/udlit-namespace-using-directive.C: Added test case to make sure gcc correctly handles using directive for UDLs. * gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C: Removed a incorrect test case. * gcc/testsuite/g++.dg/cpp0x/udlit-sfinae.C: Added a test case to make sure that enable_if can be used to select between overloads of UDLs. * gcc/testsuite/g++.dg/cpp0x/udlit-sfinae-neg.C: Added a test case to make sure gcc correctly detects substitution failures when all the UDSL overloads are disabled by enable_if. * gcc/testsuite/g++.dg/cpp1y/udlit-char-template-sfinae-neg.C: Like cpp0x/udlit-sfinae-neg.C but for string template literals. * gcc/testsuite/g++.dg/cpp1y/udlit-char-template-sfinae.C: Like cpp0x/udlit-sfinae.C but for string template literals. * gcc/testsuite/g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C: Added a test to make sure that string template literals have a smaller priority than standard literal operators. 2015-02-10 18:18 GMT+01:00 Jason Merrill ja...@redhat.com: On 02/09/2015 08:27 AM, Andrea Azzarone wrote: Please note that this is my first gcc patch Thanks, looks good! A couple of nits: * gcc/cp/parser.c: Make sure lookup_literal_operator returns all the possible candidates. Also improve the diagnostic messages. A ChangeLog entry should be per function, e.g. * parser.c (lookup_literal_operator): Return all candidates. (cp_parser_userdef_numeric_literal): Pass tf_warning_or_error. (cp_parser_userdef_string_literal): Likewise. Prefer the non-template form. @@ -4044,31 +4061,15 @@ cp_parser_userdef_string_literal (tree l { tree tmpl_args = make_string_pack (value); decl = lookup_template_function (decl, tmpl_args); - result = finish_call_expr (decl, args, false, true, tf_none); + result = finish_call_expr (decl, args, false, true, tf_warning_or_error); if (result != error_mark_node) - { - release_tree_vector (args); - return result; - } +{ + release_tree_vector (args); + return result; +} } Why not remove the test against error_mark_node here like you did in cp_parser_userdef_numeric_literal? Jason -- Andrea Azzarone http://launchpad.net/~andyrock http://wiki.ubuntu.com/AndreaAzzarone Index: gcc/cp/parser.c === --- gcc/cp/parser.c (revision 220454) +++ gcc/cp/parser.c (working copy) @@ -3828,7 +3828,7 @@ lookup_literal_operator (tree name, vec work in presence of default arguments on the literal operator parameters. */ parmtypes == void_list_node) - return fn; + return decl; } } @@ -3862,12 +3862,7 @@ cp_parser_userdef_char_literal (cp_parse } result = finish_call_expr (decl, args, false, true, tf_warning_or_error); release_tree_vector (args); - if (result != error_mark_node) -return result; - - error (unable to find character literal operator %qD with %qT argument, -name, TREE_TYPE (value)); - return error_mark_node; + return result; } /* A subroutine of cp_parser_userdef_numeric_literal to @@ -3955,26 +3950,27 @@ cp_parser_userdef_numeric_literal (cp_pa decl = lookup_literal_operator (name, args); if (decl decl != error_mark_node) { - result = finish_call_expr (decl, args, false, true, tf_none); - if (result != error_mark_node) + result = finish_call_expr (decl, args, false, true, tf_warning_or_error); + + if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE overflow 0) { - if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE overflow 0) + warning_at (token-location, OPT_Woverflow, + integer literal exceeds range of %qT type, + long_long_unsigned_type_node); + } + else + { + if (overflow 0) + warning_at (token-location, OPT_Woverflow, + floating literal exceeds range of %qT type, + long_double_type_node); + else if (overflow 0) warning_at (token-location, OPT_Woverflow, - integer literal exceeds range of %qT type, - long_long_unsigned_type_node
[PATCH] PR64959: SFINAE in UDLs
Hi all, atm enable_if cannot be used to select between overload of UDLs. E.g. https://gcc.gnu.org/bugzilla/attachment.cgi?id=34684 will not compile. This can be easily fixed making sure that lookup_literal_operator returns all the possible candidates and not just the first match. I made some more changes in parser.c to improve diagnostic in case of failures. Four testcases added: * udlit-sfinae.C * udlit-sfinae.neg.C * udlit-char-template-sfinae.C * udlit-char-template-sfinae-neg.C The first make check showed a failures in udlit-resolve.C. Actually the failures was a false positive, because UDLs lookup is a normal unqualified name lookup. I added two tests: * udlit-namespace-ambiguous.C * udlit-namespace-ambiguous-neg.C At the end I also noticed a bug in string template literals. As per N3599 the lookup should give precedence to operator_t(const char*, unsigned long). I updated the code in parser.C and added a test. Please note that this is my first gcc patch :) 2015-2-9 Andrea Azzarone azzaro...@gmail.com PR c++/64959 * gcc/cp/parser.c: Make sure lookup_literal_operator returns all the possible candidates. Also improve the diagnostic messages. * gcc/testsuite/g++.dg/cpp0x/udlit-namespace-ambiguous.C: Add test case to make sure gcc detects ambiguous UDL declarations. * gcc/testsuite/g++.dg/cpp0x/udlit-namespace-using-directive.C: Add test case to make sure gcc correctly handles using directive for UDLs. * gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C: Remove a incorrect test case. * gcc/testsuite/g++.dg/cpp0x/udlit-sfinae.C: Add a test case to make sure that enable_if can be used to select between overloads of UDLs. * gcc/testsuite/g++.dg/cpp0x/udlit-sfinae-neg.C: Add a test case to make sure gcc correctly detects substitution failures when all the UDSL overloads are disabled by enable_if. * gcc/testsuite/g++.dg/cpp1y/udlit-char-template-sfinae-neg.C: Like cpp0x/udlit-sfinae-neg.C but for string template literals. * gcc/testsuite/g++.dg/cpp1y/udlit-char-template-sfinae.C: Like cpp0x/udlit-sfinae.C but for string template literals. * gcc/testsuite/g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C: Add a test to make sure that string template literals have a smaller priority than standard literal operators. -- Andrea Azzarone Index: gcc/cp/parser.c === --- gcc/cp/parser.c (revision 220454) +++ gcc/cp/parser.c (working copy) @@ -3828,7 +3828,7 @@ lookup_literal_operator (tree name, vec work in presence of default arguments on the literal operator parameters. */ parmtypes == void_list_node) - return fn; + return decl; } } @@ -3955,7 +3955,7 @@ cp_parser_userdef_numeric_literal (cp_pa decl = lookup_literal_operator (name, args); if (decl decl != error_mark_node) { - result = finish_call_expr (decl, args, false, true, tf_none); + result = finish_call_expr (decl, args, false, true, tf_warning_or_error); if (result != error_mark_node) { if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE overflow 0) @@ -3986,7 +3986,7 @@ cp_parser_userdef_numeric_literal (cp_pa decl = lookup_literal_operator (name, args); if (decl decl != error_mark_node) { - result = finish_call_expr (decl, args, false, true, tf_none); + result = finish_call_expr (decl, args, false, true, tf_warning_or_error); if (result != error_mark_node) { release_tree_vector (args); @@ -4004,13 +4004,12 @@ cp_parser_userdef_numeric_literal (cp_pa { tree tmpl_args = make_char_string_pack (num_string); decl = lookup_template_function (decl, tmpl_args); - result = finish_call_expr (decl, args, false, true, tf_none); - if (result != error_mark_node) - { - release_tree_vector (args); - return result; - } + result = finish_call_expr (decl, args, false, true, tf_warning_or_error); + + release_tree_vector (args); + return result; } + release_tree_vector (args); error (unable to find numeric literal operator %qD, name); @@ -4035,6 +4034,24 @@ cp_parser_userdef_string_literal (tree l tree decl, result; vectree, va_gc *args; + /* Build up a call to the user-defined operator */ + /* Lookup the name we got back from the id-expression. */ + args = make_tree_vector (); + vec_safe_push (args, value); + vec_safe_push (args, build_int_cst (size_type_node, len)); + decl = lookup_literal_operator (name, args); + + if (decl decl != error_mark_node) +{ + result = finish_call_expr (decl, args, false, true, tf_warning_or_error); + if (result != error_mark_node) +{ + release_tree_vector (args); + return result; +} +} + release_tree_vector (args); + /* Look for a template function with typename parameter