Hi Jason,
Could you cast your eyes over these changes please? I intend to roll
them up into the appropriate patches. I will make sure I bootstrap
and "before-and-after" the g++.dg testsuite before pushing next time!
[PATCH 1/5] Fix uninitialized variables causing breakage with -Werror.
Not actually sure that this should be necessary. Initialization of
'direct_argvec' and 'call' and subsequent references are behind
'!generic_lambda_p' and 'generic_lambda_p' tests respectively.
'generic_lambda_p' is declared 'const bool'.
To pacify -Wmaybe-uninitialized, I have initialized them to 0.
[PATCH 2/5] Don't accept 'auto' as the 'type' of a template parameter.
The implicit function template code was incorrectly firing in a
template
parameter list.
[PATCH 3/5] Fix location diagnostics by returning to the deprecated
'input_location' global; must be a better fix for this.
Don't know why 'location_of (type)' gave "<built-in>:" rather than
"file:line:col:". My current workaround is to return to using
'input_location'. This gives the correct result but I doubt it is
acceptable.
[PATCH 4/5] Lift CALL_FROM_THUNK_P setting to above the potential
'build_cplus_new' call to prevent ICE due to unexpected tree type.
Plain old bug which I introduced when reorganizing the conversion op
code.
[PATCH 5/5] Handle forward declaration of implicit function templates.
Previously kept template parameter types in scope.
Another bug. Template parameter list erroneously left in scope.
Cheers,
Adam
[PATCH 1/5] Fix uninitialized variables causing breakage with -Werror.
---
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index 2d20333..0da22fd 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -792,8 +792,8 @@ maybe_add_lambda_conv_op (tree type)
particular, parameter pack expansions are marked
PACK_EXPANSION_LOCAL_P in
the body CALL, but not in DECLTYPE_CALL. */
- vec<tree, va_gc> *direct_argvec;
- tree decltype_call = 0, call;
+ vec<tree, va_gc> *direct_argvec = 0;
+ tree decltype_call = 0, call = 0;
tree fn_result = TREE_TYPE (TREE_TYPE (callop));
if (generic_lambda_p)
--
[PATCH 2/5] Don't accept 'auto' as the 'type' of a template parameter.
---
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index e6e24f8..6a4e863 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10323,7 +10323,12 @@ grokdeclarator (const cp_declarator
*declarator,
if (type_uses_auto (type))
{
- if (current_class_type && LAMBDA_TYPE_P (current_class_type))
+ if (template_parm_flag)
+ {
+ error ("template parameter declared %<auto%>");
+ type = error_mark_node;
+ }
+ else if (current_class_type && LAMBDA_TYPE_P (current_class_type))
{
if (cxx_dialect < cxx1y)
pedwarn (location_of (type), 0,
--
[PATCH 3/5] Fix location diagnostics by returning to the deprecated
'input_location' global; must be a better fix for this.
Using 'location_of (type)' yields "<built-in>: " rather than
"file:line:col: "
---
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6a4e863..a948580 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10331,18 +10331,18 @@ grokdeclarator (const cp_declarator
*declarator,
else if (current_class_type && LAMBDA_TYPE_P (current_class_type))
{
if (cxx_dialect < cxx1y)
- pedwarn (location_of (type), 0,
+ pedwarn (input_location, 0,
"use of %<auto%> in lambda parameter declaration "
"only available with "
"-std=c++1y or -std=gnu++1y");
}
else if (cxx_dialect < cxx1y)
- pedwarn (location_of (type), 0,
+ pedwarn (input_location, 0,
"use of %<auto%> in parameter declaration "
"only available with "
"-std=c++1y or -std=gnu++1y");
else
- pedwarn (location_of (type), OPT_Wpedantic,
+ pedwarn (input_location, OPT_Wpedantic,
"ISO C++ forbids use of %<auto%> in parameter "
"declaration");
}
--
[PATCH 4/5] Lift CALL_FROM_THUNK_P setting to above the potential
'build_cplus_new' call to prevent ICE due to unexpected tree type.
---
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index 0da22fd..0154840 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -883,16 +883,17 @@ maybe_add_lambda_conv_op (tree type)
tf_warning_or_error);
--processing_template_decl;
}
+ CALL_FROM_THUNK_P (call) = 1;
}
else
{
call = build_call_a (callop,
direct_argvec->length (),
direct_argvec->address ());
+ CALL_FROM_THUNK_P (call) = 1;
if (MAYBE_CLASS_TYPE_P (TREE_TYPE (call)))
call = build_cplus_new (TREE_TYPE (call), call, tf_warning_or_error);
}
- CALL_FROM_THUNK_P (call) = 1;
tree stattype = build_function_type (fn_result, FUNCTION_ARG_CHAIN
(callop));
--
[PATCH 5/5] Handle forward declaration of implicit function templates.
Previously kept template parameter types in scope.
---
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 5dbae75..9c26660 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -16295,10 +16295,12 @@ cp_parser_init_declarator (cp_parser* parser,
/* Peek at the next token. */
token = cp_lexer_peek_token (parser->lexer);
+
+ if (function_declarator_p (declarator))
+ {
/* Check to see if the token indicates the start of a
function-definition. */
- if (function_declarator_p (declarator)
- && cp_parser_token_starts_function_definition_p (token))
+ if (cp_parser_token_starts_function_definition_p (token))
{
if (!function_definition_allowed_p)
{
@@ -16346,6 +16348,9 @@ cp_parser_init_declarator (cp_parser* parser,
return decl;
}
}
+ else if (parser->fully_implicit_function_template_p)
+ decl = finish_fully_implicit_template (parser, decl);
+ }
/* [dcl.dcl]
--