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:
Paolo Carlini 2020-01-23 19:28:23 +01:00
parent 6f346913f2
commit c91072247e
5 changed files with 67 additions and 6 deletions

View file

@ -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.

View file

@ -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),

View file

@ -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

View 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);
}

View 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);
}