for (; attr; attr = lookup_attribute ("gnu", "assume", TREE_CHAIN (attr)))
{
tree args = TREE_VALUE (attr);
+ if (args && PACK_EXPANSION_P (args))
+ {
+ auto_diagnostic_group d;
+ error_at (attrs_loc, "pack expansion of %qE attribute",
+ get_attribute_name (attr));
+ if (cxx_dialect >= cxx17)
+ inform (attrs_loc, "use fold expression in the attribute "
+ "argument instead");
+ continue;
+ }
int nargs = list_length (args);
if (nargs != 1)
{
--- /dev/null
+// PR c++/109756
+// { dg-do compile { target c++11 } }
+
+template <int ...args>
+void
+foo ()
+{
+ [[assume (1 > 0)...]]; // { dg-error "expansion pattern '\\\(1 > 0\\\)' contains no parameter packs" }
+ // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
+ [[assume (args > 0)...]]; // { dg-error "pack expansion of 'assume' attribute" }
+ // { dg-message "use fold expression in the attribute argument instead" "" { target c++17 } .-1 }
+#if __cpp_fold_expressions >= 201603L
+ [[assume (((args > 0) && ...))]];
+#endif
+ [[gnu::assume (1 > 0)...]]; // { dg-error "expansion pattern '\\\(1 > 0\\\)' contains no parameter packs" }
+ // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
+ [[gnu::assume (args > 0)...]]; // { dg-error "pack expansion of 'assume' attribute" }
+ // { dg-message "use fold expression in the attribute argument instead" "" { target c++17 } .-1 }
+#if __cpp_fold_expressions >= 201603L
+ [[gnu::assume (((args > 0) && ...))]];
+#endif
+}