]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/55619 (Chromium build fails with: error: memory input is not directly addre...
authorJakub Jelinek <jakub@redhat.com>
Tue, 11 Dec 2012 16:51:16 +0000 (17:51 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Dec 2012 16:51:16 +0000 (17:51 +0100)
PR c++/55619
* semantics.c (finish_asm_stmt): Don't call decay_conversion
on input operands that can be only in memory.

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

From-SVN: r194404

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/asm12.C [new file with mode: 0644]

index dcb742cc12bc6489a75e8cbb8a8bda6aa9eed43e..baa119dbca991467ad82b3b1cee23fc020d6fb09 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/55619
+       * semantics.c (finish_asm_stmt): Don't call decay_conversion
+       on input operands that can be only in memory.
+
 2012-12-10  Eric Botcazou  <ebotcazou@adacore.com>
 
        * Make-lang.in (cp/typeck.o): Add dependency on $(PARAMS_H).
index 179c5089cc92562b0d48c735c857a36f6b0e4d57..ad33c658fba5134c0fbc323590794c69d505781d 100644 (file)
@@ -1369,7 +1369,15 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands,
       for (i = 0, t = input_operands; t; ++i, t = TREE_CHAIN (t))
        {
          constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
-         operand = decay_conversion (TREE_VALUE (t), tf_warning_or_error);
+         bool constraint_parsed
+           = parse_input_constraint (&constraint, i, ninputs, noutputs, 0,   
+                                     oconstraints, &allows_mem, &allows_reg);
+         /* If the operand is going to end up in memory, don't call
+            decay_conversion.  */
+         if (constraint_parsed && !allows_reg && allows_mem)
+           operand = mark_lvalue_use (TREE_VALUE (t));
+         else
+           operand = decay_conversion (TREE_VALUE (t), tf_warning_or_error);
 
          /* If the type of the operand hasn't been determined (e.g.,
             because it involves an overloaded function), then issue
@@ -1382,8 +1390,7 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands,
              operand = error_mark_node;
            }
 
-         if (parse_input_constraint (&constraint, i, ninputs, noutputs, 0,
-                                     oconstraints, &allows_mem, &allows_reg))
+         if (constraint_parsed)
            {
              /* If the operand is going to end up in memory,
                 mark it addressable.  */
index efdb9336377ef6e60b2c16d2a4173fc93a675be3..c6c8bead6c4f902ef50f8e462bd62704e55206d4 100644 (file)
@@ -1,5 +1,8 @@
 2012-12-11  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/55619
+       * g++.dg/ext/asm12.C: New test.
+
        PR tree-optimization/54570
        * gcc.dg/builtin-object-size-8.c: Xfail.
        * gcc.dg/builtin-object-size-13.c: New test.
diff --git a/gcc/testsuite/g++.dg/ext/asm12.C b/gcc/testsuite/g++.dg/ext/asm12.C
new file mode 100644 (file)
index 0000000..9823a8f
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/55619
+// { dg-do compile }
+
+typedef int V __attribute__ ((vector_size (4 * sizeof (int))));
+
+static const V C = { 0x201, 0, 0, 0 };
+static const int D = 0x201;
+
+void
+f ()
+{
+  __asm volatile ("" : : "m" (C));
+  __asm volatile ("" : : "m" (D));
+}