diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2005-10-05 12:17:16 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2005-10-05 12:17:16 +0000 |
commit | 5544530ae53f6a1063641ae448bc9cd62c8f6ee7 (patch) | |
tree | 56889bd0e587b4c391a24d46c92ac8f2af4f0978 /gcc/cp/semantics.c | |
parent | c82cdb5dfc2b9e85dbe577e32d73dc8fd6062afe (diff) | |
download | gcc-5544530ae53f6a1063641ae448bc9cd62c8f6ee7.zip gcc-5544530ae53f6a1063641ae448bc9cd62c8f6ee7.tar.gz gcc-5544530ae53f6a1063641ae448bc9cd62c8f6ee7.tar.bz2 |
re PR c/21419 (Accepts writting to const via asm)
2005-10-05 Paolo Bonzini <bonzini@gnu.org>
PR tree-optimization/21419
PR tree-optimization/24146
PR tree-optimization/24151
* c-typeck.c (readonly_error): Handle USE being lv_asm.
(build_asm_expr): Call it if outputs are read-only.
* gimplify.c (gimplify_asm_expr): Remove former fix to PR 21419.
cp:
2005-10-05 Paolo Bonzini <bonzini@gnu.org>
PR tree-optimization/21419
PR tree-optimization/24146
PR tree-optimization/24151
* semantics.c (finish_asm_stmt): Call readonly_error if outputs are
read-only. Set ASM_VOLATILE_P for asms without outputs.
testsuite:
2005-10-05 Paolo Bonzini <bonzini@gnu.org>
PR tree-optimization/21419
PR tree-optimization/24146
PR tree-optimization/24151
* g++.dg/ext/asm7.C: New.
* g++.dg/ext/asm8.C: New.
* gcc.dg/asm-1.c: Compile on all targets.
* gcc.dg/asm-pr24146.c: New.
* gcc.dg/pr21419.c: Adjust error messages.
From-SVN: r104988
Diffstat (limited to 'gcc/cp/semantics.c')
-rw-r--r-- | gcc/cp/semantics.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c7392b0..80885c5 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1165,18 +1165,17 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands, { tree r; tree t; + int ninputs = list_length (input_operands); + int noutputs = list_length (output_operands); if (!processing_template_decl) { - int ninputs, noutputs; const char *constraint; const char **oconstraints; bool allows_mem, allows_reg, is_inout; tree operand; int i; - ninputs = list_length (input_operands); - noutputs = list_length (output_operands); oconstraints = (const char **) alloca (noutputs * sizeof (char *)); string = resolve_asm_operand_names (string, output_operands, @@ -1197,6 +1196,19 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands, if (!lvalue_or_else (operand, lv_asm)) operand = error_mark_node; + if (operand != error_mark_node + && (TREE_READONLY (operand) + || CP_TYPE_CONST_P (TREE_TYPE (operand)) + /* Functions are not modifiable, even though they are + lvalues. */ + || TREE_CODE (TREE_TYPE (operand)) == FUNCTION_TYPE + || TREE_CODE (TREE_TYPE (operand)) == METHOD_TYPE + /* If it's an aggregate and any field is const, then it is + effectively const. */ + || (CLASS_TYPE_P (TREE_TYPE (operand)) + && C_TYPE_FIELDS_READONLY (TREE_TYPE (operand))))) + readonly_error (operand, "assignment (via 'asm' output)", 0); + constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t))); oconstraints[i] = constraint; @@ -1254,7 +1266,7 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands, r = build_stmt (ASM_EXPR, string, output_operands, input_operands, clobbers); - ASM_VOLATILE_P (r) = volatile_p; + ASM_VOLATILE_P (r) = volatile_p || noutputs == 0; r = maybe_cleanup_point_expr_void (r); return add_stmt (r); } |