summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--struct.c3
-rw-r--r--test/ruby/test_struct.rb4
2 files changed, 7 insertions, 0 deletions
diff --git a/struct.c b/struct.c
index 4ebf6aa3fa..7a78b4946f 100644
--- a/struct.c
+++ b/struct.c
@@ -551,6 +551,9 @@ rb_struct_s_def(int argc, VALUE *argv, VALUE klass)
tbl = RHASH_TBL(rest);
for (i=0; i<argc; i++) {
VALUE mem = rb_to_symbol(argv[i]);
+ if (rb_is_attrset_sym(mem)) {
+ rb_raise(rb_eArgError, "invalid struct member: %"PRIsVALUE, mem);
+ }
if (st_insert(tbl, mem, Qtrue)) {
rb_raise(rb_eArgError, "duplicate member: %"PRIsVALUE, mem);
}
diff --git a/test/ruby/test_struct.rb b/test/ruby/test_struct.rb
index db3d767edd..502affef07 100644
--- a/test/ruby/test_struct.rb
+++ b/test/ruby/test_struct.rb
@@ -60,6 +60,10 @@ module TestStruct
assert_equal(1, o.a)
end
+ def test_attrset_id
+ assert_raise(ArgumentError) { Struct.new(:x=) }
+ end
+
def test_members
klass = @Struct.new(:a)
o = klass.new(1)