Fix "PR c++/92804 ICE trying to use concept as a nested-name-specifier"
A rather simple ICE where we failed to properly check for concept-ids uses in nested-name-specifiers. Tested x86_64-linux. /cp PR c++/92804 * parser.c (cp_parser_nested_name_specifier_opt): Properly diagnose concept-ids. /testsuite PR c++/92804 * g++.dg/concepts/pr92804-1.C: New. * g++.dg/concepts/pr92804-2.C: New.
This commit is contained in:
parent
6f346913f2
commit
c91072247e
5 changed files with 67 additions and 6 deletions
|
@ -1,3 +1,9 @@
|
|||
2020-01-23 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/92804
|
||||
* parser.c (cp_parser_nested_name_specifier_opt): Properly
|
||||
diagnose concept-ids.
|
||||
|
||||
2020-01-23 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/93331 - ICE with __builtin_strchr.
|
||||
|
|
|
@ -6467,16 +6467,27 @@ cp_parser_nested_name_specifier_opt (cp_parser *parser,
|
|||
tree fns = get_fns (tid);
|
||||
if (OVL_SINGLE_P (fns))
|
||||
tmpl = OVL_FIRST (fns);
|
||||
error_at (token->location, "function template-id %qD "
|
||||
"in nested-name-specifier", tid);
|
||||
if (function_concept_p (fns))
|
||||
error_at (token->location, "concept-id %qD "
|
||||
"in nested-name-specifier", tid);
|
||||
else
|
||||
error_at (token->location, "function template-id "
|
||||
"%qD in nested-name-specifier", tid);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Variable template. */
|
||||
tmpl = TREE_OPERAND (tid, 0);
|
||||
gcc_assert (variable_template_p (tmpl));
|
||||
error_at (token->location, "variable template-id %qD "
|
||||
"in nested-name-specifier", tid);
|
||||
if (variable_concept_p (tmpl)
|
||||
|| standard_concept_p (tmpl))
|
||||
error_at (token->location, "concept-id %qD "
|
||||
"in nested-name-specifier", tid);
|
||||
else
|
||||
{
|
||||
/* Variable template. */
|
||||
gcc_assert (variable_template_p (tmpl));
|
||||
error_at (token->location, "variable template-id "
|
||||
"%qD in nested-name-specifier", tid);
|
||||
}
|
||||
}
|
||||
if (tmpl)
|
||||
inform (DECL_SOURCE_LOCATION (tmpl),
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2020-01-23 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/92804
|
||||
* g++.dg/concepts/pr92804-1.C: New.
|
||||
* g++.dg/concepts/pr92804-2.C: Likewise.
|
||||
|
||||
2020-01-23 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
PR analyzer/93375
|
||||
|
|
19
gcc/testsuite/g++.dg/concepts/pr92804-1.C
Normal file
19
gcc/testsuite/g++.dg/concepts/pr92804-1.C
Normal file
|
@ -0,0 +1,19 @@
|
|||
// { dg-do compile { target c++17 } }
|
||||
// { dg-options "-fconcepts" }
|
||||
|
||||
template<typename T>
|
||||
concept foo = true; // { dg-message "declared here" }
|
||||
|
||||
template<typename T>
|
||||
void bar(T t)
|
||||
{
|
||||
if constexpr (foo<T>::value) // { dg-error "17:concept-id .foo<T>. in nested-name-specifier" }
|
||||
// { dg-error "expected|value" "" { target c++17 } .-1 }
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
bar(1);
|
||||
}
|
19
gcc/testsuite/g++.dg/concepts/pr92804-2.C
Normal file
19
gcc/testsuite/g++.dg/concepts/pr92804-2.C
Normal file
|
@ -0,0 +1,19 @@
|
|||
// { dg-do compile { target c++17 } }
|
||||
// { dg-options "-fconcepts-ts" }
|
||||
|
||||
template<typename T>
|
||||
concept bool foo() { return true; }; // { dg-message "declared here" }
|
||||
|
||||
template<typename T>
|
||||
void bar(T t)
|
||||
{
|
||||
if constexpr (foo<T>::value) // { dg-error "17:concept-id .foo<T>. in nested-name-specifier" }
|
||||
// { dg-error "expected|value" "" { target *-*-* } .-1 }
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
bar(1);
|
||||
}
|
Loading…
Add table
Reference in a new issue