@@ -571,14 +571,15 @@ const struct c_common_resword c_common_reswords[] =
{ "oneway", RID_ONEWAY, D_OBJC },
{ "out", RID_OUT, D_OBJC },
/* These are recognized inside a property attribute list */
- { "assign", RID_ASSIGN, D_OBJC },
- { "copy", RID_COPY, D_OBJC },
- { "getter", RID_GETTER, D_OBJC },
- { "nonatomic", RID_NONATOMIC, D_OBJC },
- { "readonly", RID_READONLY, D_OBJC },
- { "readwrite", RID_READWRITE, D_OBJC },
- { "retain", RID_RETAIN, D_OBJC },
- { "setter", RID_SETTER, D_OBJC },
+ { "assign", RID_ASSIGN, D_OBJC },
+ { "atomic", RID_PROPATOMIC, D_OBJC },
+ { "copy", RID_COPY, D_OBJC },
+ { "getter", RID_GETTER, D_OBJC },
+ { "nonatomic", RID_NONATOMIC, D_OBJC },
+ { "readonly", RID_READONLY, D_OBJC },
+ { "readwrite", RID_READWRITE, D_OBJC },
+ { "retain", RID_RETAIN, D_OBJC },
+ { "setter", RID_SETTER, D_OBJC },
};
const unsigned int num_c_common_reswords =
@@ -85,7 +85,7 @@ enum rid
RID_GETTER, RID_SETTER,
RID_READONLY, RID_READWRITE,
RID_ASSIGN, RID_RETAIN, RID_COPY,
- RID_NONATOMIC,
+ RID_PROPATOMIC, RID_NONATOMIC,
/* C (reserved and imaginary types not implemented, so any use is a
syntax error) */
@@ -822,6 +822,7 @@ objc_prop_attr_kind_for_rid (enum rid prop_rid)
case RID_RETAIN: return OBJC_PROPERTY_ATTR_RETAIN;
case RID_COPY: return OBJC_PROPERTY_ATTR_COPY;
+ case RID_PROPATOMIC: return OBJC_PROPERTY_ATTR_ATOMIC;
case RID_NONATOMIC: return OBJC_PROPERTY_ATTR_NONATOMIC;
}
@@ -16,6 +16,7 @@
/* Test that all the new property attributes can be parsed. */
@property (assign) id property_a;
@property (copy) id property_b;
+@property (atomic) int property_ca;
@property (nonatomic) int property_c;
@property (readonly) int property_d;
@property (readwrite) int property_e;
@@ -34,6 +35,8 @@
@property (assign, copy) id d; /* { dg-error ".copy. attribute conflicts with .assign. attribute" } */
@property (copy, retain) id e; /* { dg-error ".retain. attribute conflicts with .copy. attribute" } */
+@property (atomic, nonatomic) int property_j; /* { dg-error {'nonatomic' attribute conflicts with 'atomic' attribute} } */
+
@property (setter=mySetter:,setter=mySetter2:) int f; /* { dg-warning {multiple property 'setter' methods specified, the latest one will be used} } */
@property (getter=myGetter, getter=myGetter2 ) int g; /* { dg-warning {multiple property 'getter' methods specified, the latest one will be used} } */
@@ -16,6 +16,7 @@
/* Test that all the new property attributes can be parsed. */
@property (assign) id property_a;
@property (copy) id property_b;
+@property (atomic) int property_ca;
@property (nonatomic) int property_c;
@property (readonly) int property_d;
@property (readwrite) int property_e;
@@ -34,6 +35,8 @@
@property (assign, copy) id d; /* { dg-error ".copy. attribute conflicts with .assign. attribute" } */
@property (copy, retain) id e; /* { dg-error ".retain. attribute conflicts with .copy. attribute" } */
+@property (atomic, nonatomic) int property_j; /* { dg-error {'nonatomic' attribute conflicts with 'atomic' attribute} } */
+
@property (setter=mySetter:,setter=mySetter2:) int f; /* { dg-warning {multiple property 'setter' methods specified, the latest one will be used} } */
@property (getter=myGetter, getter=myGetter2 ) int g; /* { dg-warning {multiple property 'getter' methods specified, the latest one will be used} } */