diff mbox

Fix 67064 - Register asm variable broken

Message ID 5625E3C7.1010709@redhat.com
State New
Headers show

Commit Message

Jason Merrill Oct. 20, 2015, 6:48 a.m. UTC
On 09/22/2015 06:03 AM, Jason Merrill wrote:
> A simple fix would be to just disable the reference games when we're
> looking at a hard register variable.  That would break decltype(auto)
> for hard register variables, but since they are a GNU extension that
> isn't a big deal.

Like so.

Tested x86_64-pc-linux-gnu, applying to trunk.
diff mbox

Patch

commit a5e9d513231728c3c52d956311fb9e5f06097184
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Jul 30 14:55:57 2015 -0400

    	PR c++/67064
    
    	* semantics.c (force_paren_expr): Don't mess with hard register vars.

diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 8796b17..c0a8b32 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1660,6 +1660,8 @@  force_paren_expr (tree expr)
     REF_PARENTHESIZED_P (expr) = true;
   else if (type_dependent_expression_p (expr))
     expr = build1 (PAREN_EXPR, TREE_TYPE (expr), expr);
+  else if (VAR_P (expr) && DECL_HARD_REGISTER (expr))
+    /* We can't bind a hard register variable to a reference.  */;
   else
     {
       cp_lvalue_kind kind = lvalue_kind (expr);
diff --git a/gcc/testsuite/g++.dg/parse/parens3.C b/gcc/testsuite/g++.dg/parse/parens3.C
new file mode 100644
index 0000000..afb392b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parens3.C
@@ -0,0 +1,18 @@ 
+// PR c++/67064
+// { dg-options "-w" }
+
+struct s {
+  int i;
+};
+
+register struct s *reg __asm__( "1" );
+
+int f(void)
+{
+  int i;
+
+  i = reg->i;
+  i = (reg)->i;
+
+  return i;
+}