From 6f762481a21f211c03b6eda416b5d5737c3ed4b7 Mon Sep 17 00:00:00 2001
From: Iain Sandoe <iain@sandoe.co.uk>
Date: Mon, 2 Nov 2020 21:12:38 +0000
Subject: [PATCH] Objective-C/C++ (C-family) : Add missing 'atomic' property
 attribute.

This is the default, but it is still legal in user code and therefore
we should handle it in parsing.  Fix whitespace issues in the lines
affected.

gcc/c-family/ChangeLog:

	* c-common.c (c_common_reswords): Add 'atomic' property
	attribute.
	* c-common.h (enum rid): Add RID_PROPATOMIC for atomic
	property attributes.

gcc/objc/ChangeLog:

	* objc-act.c (objc_prop_attr_kind_for_rid): Handle
	RID_PROPATOMIC.

gcc/testsuite/ChangeLog:

	* obj-c++.dg/property/at-property-4.mm: Test atomic property
	attribute.
	* objc.dg/property/at-property-4.m: Likewise.
---
 gcc/c-family/c-common.c                         | 17 +++++++++--------
 gcc/c-family/c-common.h                         |  2 +-
 gcc/objc/objc-act.c                             |  1 +
 .../obj-c++.dg/property/at-property-4.mm        |  3 +++
 gcc/testsuite/objc.dg/property/at-property-4.m  |  3 +++
 5 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 9302a2461d4a..d4d3228b8f63 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -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 =
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 18b489d55a34..7e2cd5342aa6 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -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) */
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 8be4beadf3bc..2dad46aa77e6 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -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;
 
     }
diff --git a/gcc/testsuite/obj-c++.dg/property/at-property-4.mm b/gcc/testsuite/obj-c++.dg/property/at-property-4.mm
index 4083947de71d..31f2eb4336ab 100644
--- a/gcc/testsuite/obj-c++.dg/property/at-property-4.mm
+++ b/gcc/testsuite/obj-c++.dg/property/at-property-4.mm
@@ -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} } */
 
diff --git a/gcc/testsuite/objc.dg/property/at-property-4.m b/gcc/testsuite/objc.dg/property/at-property-4.m
index 4083947de71d..31f2eb4336ab 100644
--- a/gcc/testsuite/objc.dg/property/at-property-4.m
+++ b/gcc/testsuite/objc.dg/property/at-property-4.m
@@ -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} } */
 
-- 
GitLab