]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: argument order in a variadic type trait intrinsic
authorPatrick Palka <ppalka@redhat.com>
Thu, 30 Sep 2021 21:29:18 +0000 (17:29 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 30 Sep 2021 21:29:18 +0000 (17:29 -0400)
When parsing a variadic type trait intrinsic, we build up the list of
trailing arguments in reverse, but we neglect to reverse the list to
the true order afterwards.  This causes us to confuse the meaning of
e.g. __is_xible(x, y, z) vs __is_xible(x, z, y).

Note that this bug doesn't affect the library traits because they pass a
pack expansion as the single trailing argument to __is_xible, which gets
expanded in the correct order by tsubst_tree_list.

gcc/cp/ChangeLog:

* parser.c (cp_parser_trait_expr): Call nreverse on the reversed
list of trailing arguments.

gcc/testsuite/ChangeLog:

* g++.dg/ext/is_constructible6.C: New test.

gcc/cp/parser.c
gcc/testsuite/g++.dg/ext/is_constructible6.C [new file with mode: 0644]

index 8430445ef8c189f0ed398db27aa943b579a4a952..04f5a24cc03c6a492afc747f9f77ef5a705f944a 100644 (file)
@@ -10832,6 +10832,7 @@ cp_parser_trait_expr (cp_parser* parser, enum rid keyword)
            return error_mark_node;
          type2 = tree_cons (NULL_TREE, elt, type2);
        }
+      type2 = nreverse (type2);
     }
 
   location_t finish_loc = cp_lexer_peek_token (parser->lexer)->location;
diff --git a/gcc/testsuite/g++.dg/ext/is_constructible6.C b/gcc/testsuite/g++.dg/ext/is_constructible6.C
new file mode 100644 (file)
index 0000000..7fce153
--- /dev/null
@@ -0,0 +1,10 @@
+// Verify we respect the order of trailing arguments passed to
+// __is_constructible.
+
+struct A { };
+struct B { };
+struct C { C(A, B); };
+
+extern int n[true];
+extern int n[ __is_constructible(C, A, B)];
+extern int n[!__is_constructible(C, B, A)];