cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
cp_parser_nested_name_specifier_opt (parser,
/*typename_keyword_p=*/true,
- /*check_dependency_p=*/false,
+ /*check_dependency_p=*/true,
/*type_p=*/true,
/*is_declaration=*/false);
cp_lexer_consume_token (parser->lexer);
type = cp_parser_template_id (parser,
/*template_keyword_p=*/true,
- /*check_dependency=*/false,
+ /*check_dependency_p=*/true,
/*tag_type=*/none_type,
/*is_declaration=*/false);
type = make_typename_type (parser->scope, type, typename_type,
--- /dev/null
+// PR c++/110927
+// { dg-do compile { target c++20 } }
+
+template<class T>
+struct A {
+ template<class U> struct B { using type = B; };
+ template<class U> using type = U;
+};
+
+template<> struct A<void> { };
+
+template<class T>
+concept C1 = requires { typename A<T>::template B<bool>::type; };
+
+template<class T>
+concept C2 = requires { typename A<T>::template B<bool>; };
+
+template<class T>
+concept C3 = requires { typename A<T>::template type<bool>; };
+
+static_assert(C1<int>);
+static_assert(C2<int>);
+static_assert(C3<int>);
+
+static_assert(!C1<void>);
+static_assert(!C2<void>);
+static_assert(!C3<void>);