aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2020-01-23 19:28:23 +0100
committerPaolo Carlini <paolo.carlini@oracle.com>2020-01-23 19:28:23 +0100
commitc91072247eb066ec9c6cd0b0f949c7dae691e46c (patch)
tree6d019e1440addfdab8a7e8611a0b287df5576a6f /gcc
parent6f346913f2a87e26c6095d9fbf3d20f926c5470a (diff)
downloadgcc-c91072247eb066ec9c6cd0b0f949c7dae691e46c.zip
gcc-c91072247eb066ec9c6cd0b0f949c7dae691e46c.tar.gz
gcc-c91072247eb066ec9c6cd0b0f949c7dae691e46c.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c23
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/concepts/pr92804-1.C19
-rw-r--r--gcc/testsuite/g++.dg/concepts/pr92804-2.C19
5 files changed, 67 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b13ee2b..c01bece 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index dc07dc5..72037ee 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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),
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ef4c6fc..93fb3be 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/g++.dg/concepts/pr92804-1.C b/gcc/testsuite/g++.dg/concepts/pr92804-1.C
new file mode 100644
index 0000000..cc21426
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/pr92804-1.C
@@ -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);
+}
diff --git a/gcc/testsuite/g++.dg/concepts/pr92804-2.C b/gcc/testsuite/g++.dg/concepts/pr92804-2.C
new file mode 100644
index 0000000..32a1554
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/pr92804-2.C
@@ -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);
+}