aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <mpolacek@gcc.gnu.org>2015-04-28 08:36:50 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2015-04-28 08:36:50 +0000
commit4e81b788bb6a2f4ecc51965232727d86ca375c94 (patch)
treee4a78f92a29b33f3fb61d3b79130e6b5b072cc49 /gcc
parent90dd6e3df86c81bdc1380513c57cce64caf32f72 (diff)
downloadgcc-4e81b788bb6a2f4ecc51965232727d86ca375c94.zip
gcc-4e81b788bb6a2f4ecc51965232727d86ca375c94.tar.gz
gcc-4e81b788bb6a2f4ecc51965232727d86ca375c94.tar.bz2
re PR c/65901 (no warning or error for va_arg (ap, void))
PR c/65901 * c-typeck.c (c_build_va_arg): Require TYPE be a complete type. * gcc.c-torture/compile/pr48767.c (foo): Add dg-error. * gcc.dg/pr65901.c: New test. From-SVN: r222515
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/ChangeLog5
-rw-r--r--gcc/c/c-typeck.c5
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr48767.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr65901.c16
5 files changed, 34 insertions, 2 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 938262a9..5d50d4c 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-28 Marek Polacek <polacek@redhat.com>
+
+ PR c/65901
+ * c-typeck.c (c_build_va_arg): Require TYPE be a complete type.
+
2015-04-25 Marek Polacek <polacek@redhat.com>
PR c/52085
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 91735b5..c58e918 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -12648,6 +12648,11 @@ c_build_va_arg (location_t loc, tree expr, tree type)
if (warn_cxx_compat && TREE_CODE (type) == ENUMERAL_TYPE)
warning_at (loc, OPT_Wc___compat,
"C++ requires promoted type, not enum type, in %<va_arg%>");
+ if (type == error_mark_node || !COMPLETE_TYPE_P (type))
+ {
+ c_incomplete_type_error (NULL_TREE, type);
+ return error_mark_node;
+ }
return build_va_arg (loc, expr, type);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 703bc3a..fcd850c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-04-28 Marek Polacek <polacek@redhat.com>
+
+ PR c/65901
+ * gcc.c-torture/compile/pr48767.c (foo): Add dg-error.
+ * gcc.dg/pr65901.c: New test.
+
2015-04-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/62283
@@ -11,7 +17,7 @@
2015-04-27 Jeff Law <law@redhat.com>
- PR tree-optimization/65217
+ PR tree-optimization/65217
* gcc.target/i386/pr65217.c: Remove XFAIL.
2015-04-27 Andre Vehreschild <vehre@gmx.de>
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr48767.c b/gcc/testsuite/gcc.c-torture/compile/pr48767.c
index 66cb348..c8fef35 100644
--- a/gcc/testsuite/gcc.c-torture/compile/pr48767.c
+++ b/gcc/testsuite/gcc.c-torture/compile/pr48767.c
@@ -3,5 +3,5 @@
void
foo (__builtin_va_list ap)
{
- __builtin_va_arg (ap, void);
+ __builtin_va_arg (ap, void); /* { dg-error "invalid use of void expression" } */
}
diff --git a/gcc/testsuite/gcc.dg/pr65901.c b/gcc/testsuite/gcc.dg/pr65901.c
new file mode 100644
index 0000000..8708a1e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr65901.c
@@ -0,0 +1,16 @@
+/* PR c/65901 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct S;
+enum E;
+union U;
+
+void
+foo (__builtin_va_list ap)
+{
+ __builtin_va_arg (ap, void); /* { dg-error "invalid use of void expression" } */
+ __builtin_va_arg (ap, struct S); /* { dg-error "invalid use of undefined type" } */
+ __builtin_va_arg (ap, enum E); /* { dg-error "invalid use of undefined type" } */
+ __builtin_va_arg (ap, union U); /* { dg-error "invalid use of undefined type" } */
+}