local scope. */
return true;
- if ((TREE_CODE (decl) == TYPE_DECL
- && TREE_TYPE (decl)
+ if ((DECL_IMPLICIT_TYPEDEF_P (decl)
&& LAMBDA_TYPE_P (TREE_TYPE (decl)))
|| (TREE_CODE (decl) == FUNCTION_DECL
&& LAMBDA_FUNCTION_P (decl)))
template <typename T> friend void A<T>::f();
is not primary. */
;
- else if (TREE_CODE (decl) == TYPE_DECL && LAMBDA_TYPE_P (TREE_TYPE (decl)))
+ else if (DECL_IMPLICIT_TYPEDEF_P (decl) && LAMBDA_TYPE_P (TREE_TYPE (decl)))
/* Lambdas are not primary. */
;
else
else if (!ctx
|| TREE_CODE (ctx) == FUNCTION_DECL
|| (CLASS_TYPE_P (ctx) && TYPE_BEING_DEFINED (ctx))
- || (TREE_CODE (decl) == TYPE_DECL && LAMBDA_TYPE_P (TREE_TYPE (decl)))
+ || (DECL_IMPLICIT_TYPEDEF_P (decl)
+ && LAMBDA_TYPE_P (TREE_TYPE (decl)))
|| (is_friend && !(DECL_LANG_SPECIFIC (decl)
&& DECL_TEMPLATE_INFO (decl))))
{
--- /dev/null
+// { dg-do compile { target c++20 } }
+
+// PR c++/106221
+using T = decltype([](){});
+
+template<typename Opts>
+using foo = T;
+
+using bar = foo<int>;
+
+// PR c++/110680
+template <auto X = []{}>
+struct S {
+ auto f() { return X; }
+};
+
+template <class T>
+using C = decltype(S().f());
+
+using D = C<int>;