Fix PR c++/69091 (ICE with operator overload having 'auto' return type)
gcc/cp/ChangeLog: PR c++/69091 * pt.c (type_dependent_expression_p): For a function template specialization, a type is dependent iff any of its template arguments are. gcc/testsuite/ChangeLog: PR c++/69091 * g++.dg/template/pr69091.C: New test. From-SVN: r232463
This commit is contained in:
parent
203484bb27
commit
ec7886c19b
4 changed files with 41 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
|||
2016-01-16 Patrick Palka <ppalka@gcc.gnu.org>
|
||||
|
||||
PR c++/69091
|
||||
* pt.c (type_dependent_expression_p): For a function template
|
||||
specialization, a type is dependent iff any of its template
|
||||
arguments are.
|
||||
|
||||
2016-01-16 Patrick Palka <ppalka@gcc.gnu.org>
|
||||
|
||||
* cp-array-notation.c (cp_expand_cond_array_notations): Return
|
||||
|
|
|
@ -22759,12 +22759,12 @@ type_dependent_expression_p (tree expression)
|
|||
|| dependent_scope_p (scope));
|
||||
}
|
||||
|
||||
/* A function template specialization is type-dependent if it has any
|
||||
dependent template arguments. */
|
||||
if (TREE_CODE (expression) == FUNCTION_DECL
|
||||
&& DECL_LANG_SPECIFIC (expression)
|
||||
&& DECL_TEMPLATE_INFO (expression)
|
||||
&& (any_dependent_template_arguments_p
|
||||
(INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression)))))
|
||||
return true;
|
||||
&& DECL_TEMPLATE_INFO (expression))
|
||||
return any_dependent_template_arguments_p (DECL_TI_ARGS (expression));
|
||||
|
||||
if (TREE_CODE (expression) == TEMPLATE_DECL
|
||||
&& !DECL_TEMPLATE_TEMPLATE_PARM_P (expression))
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2016-01-16 Patrick Palka <ppalka@gcc.gnu.org>
|
||||
|
||||
PR c++/69091
|
||||
* g++.dg/template/pr69091.C: New test.
|
||||
|
||||
2016-01-16 Patrick Palka <ppalka@gcc.gnu.org>
|
||||
|
||||
* c-c++-common/cilk-plus/AN/an-if.c: Check that the original
|
||||
|
|
25
gcc/testsuite/g++.dg/template/pr69091.C
Normal file
25
gcc/testsuite/g++.dg/template/pr69091.C
Normal file
|
@ -0,0 +1,25 @@
|
|||
// PR c++/69091
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
template <class ValueType, ValueType>
|
||||
struct Option {};
|
||||
|
||||
template <class ValueType, ValueType Value, class OptionsRhs>
|
||||
auto operator|(Option<ValueType, Value>, OptionsRhs) {
|
||||
return Value;
|
||||
}
|
||||
|
||||
enum canine_t { no, yes };
|
||||
Option<canine_t, no> cat;
|
||||
Option<canine_t, yes> dog;
|
||||
|
||||
template <class T>
|
||||
void f(T) {
|
||||
cat | dog;
|
||||
}
|
||||
|
||||
struct A {};
|
||||
int main() {
|
||||
f(A{});
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue