Fix target attribute handling (PR c++/81355).
authorMartin Liska <mliska@suse.cz>
Thu, 10 Aug 2017 07:43:49 +0000 (09:43 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 10 Aug 2017 07:43:49 +0000 (07:43 +0000)
2017-08-10  Martin Liska  <mliska@suse.cz>

PR c++/81355
* c-attribs.c (handle_target_attribute):
Report warning for an empty string argument of target attribute.
2017-08-10  Martin Liska  <mliska@suse.cz>

PR c++/81355
* g++.dg/other/pr81355.C: New test.

From-SVN: r251020

gcc/ChangeLog
gcc/c-family/c-attribs.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/pr81355.C [new file with mode: 0644]

index 1b0292567755ae0a5549d51418a40d2f0e67d14b..1694c21e4977f1bfd4fc976fdc54c70307442b4f 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-10  Martin Liska  <mliska@suse.cz>
+
+       PR c++/81355
+       * c-attribs.c (handle_target_attribute):
+       Report warning for an empty string argument of target attribute.
+
 2017-08-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/81687
index 0d9ab2d6ae037d36667ee2558e3aa91226f21095..a40b0649ca3d7006adb8fe8875f282a8a2850a9f 100644 (file)
@@ -3139,6 +3139,19 @@ handle_target_attribute (tree *node, tree name, tree args, int flags,
                                                      flags))
     *no_add_attrs = true;
 
+  /* Check that there's no empty string in values of the attribute.  */
+  for (tree t = args; t != NULL_TREE; t = TREE_CHAIN (t))
+    {
+      tree value = TREE_VALUE (t);
+      if (TREE_CODE (value) == STRING_CST
+         && TREE_STRING_LENGTH (value) == 1
+         && TREE_STRING_POINTER (value)[0] == '\0')
+       {
+         warning (OPT_Wattributes, "empty string in attribute %<target%>");
+         *no_add_attrs = true;
+       }
+    }
+
   return NULL_TREE;
 }
 
index 6eac250b97dd37de5fbe3a211ced7862b1bf10a5..4d1e3c61444bf8b4581d2002053f0e2c6fc6029d 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-10  Martin Liska  <mliska@suse.cz>
+
+       PR c++/81355
+       * g++.dg/other/pr81355.C: New test.
+
 2017-08-09  David Malcolm  <dmalcolm@redhat.com>
 
        * jit.dg/all-non-failing-tests.h: Add note about
diff --git a/gcc/testsuite/g++.dg/other/pr81355.C b/gcc/testsuite/g++.dg/other/pr81355.C
new file mode 100644 (file)
index 0000000..89d1b41
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile { target x86_64-*-* } } */
+
+__attribute__((target("default")))
+int foo() {return 1;}
+
+__attribute__((target("arch=core2", "")))
+int foo2() {return 2;} /* { dg-warning "empty string in attribute .target." } */
+
+__attribute__((target("sse4.2", "", "")))
+int foo3() {return 2;} /* { dg-warning "empty string in attribute .target." } */
+
+int main() {
+    return foo() + foo2() + foo3();
+}