diff options
-rw-r--r-- | clang/include/clang/Basic/Attr.td | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 16 | ||||
-rw-r--r-- | clang/test/Sema/pragma-ms_struct.c | 4 | ||||
-rw-r--r-- | clang/utils/TableGen/ClangAttrEmitter.cpp | 8 |
4 files changed, 10 insertions, 22 deletions
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index ca70fec4118..5e1dba89bd9 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -576,13 +576,13 @@ def NSBridged : InheritableAttr { def ObjCBridge : InheritableAttr { let Spellings = [GNU<"objc_bridge">]; -// let Subjects = SubjectList<[Record], ErrorDiag>; + let Subjects = SubjectList<[Record], ErrorDiag>; let Args = [IdentifierArgument<"BridgedType">]; } def ObjCBridgeMutable : InheritableAttr { let Spellings = [GNU<"objc_bridge_mutable">]; -// let Subjects = SubjectList<[Record], ErrorDiag>; + let Subjects = SubjectList<[Record], ErrorDiag>; let Args = [IdentifierArgument<"BridgedType">]; } diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index ccbf9ac1356..0c3a257dc41 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3891,14 +3891,6 @@ static void handleNSBridgedAttr(Sema &S, Scope *Sc, Decl *D, static void handleObjCBridgeAttr(Sema &S, Scope *Sc, Decl *D, const AttributeList &Attr) { - if (!isa<RecordDecl>(D)) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type) - << Attr.getName() - << (S.getLangOpts().CPlusPlus ? ExpectedStructOrUnionOrClass - : ExpectedStructOrUnion); - return; - } - IdentifierLoc * Parm = Attr.isArgIdent(0) ? Attr.getArgAsIdent(0) : 0; if (!Parm) { @@ -3913,14 +3905,6 @@ static void handleObjCBridgeAttr(Sema &S, Scope *Sc, Decl *D, static void handleObjCBridgeMutableAttr(Sema &S, Scope *Sc, Decl *D, const AttributeList &Attr) { - if (!isa<RecordDecl>(D)) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type) - << Attr.getName() - << (S.getLangOpts().CPlusPlus ? ExpectedStructOrUnionOrClass - : ExpectedStructOrUnion); - return; - } - IdentifierLoc * Parm = Attr.isArgIdent(0) ? Attr.getArgAsIdent(0) : 0; if (!Parm) { diff --git a/clang/test/Sema/pragma-ms_struct.c b/clang/test/Sema/pragma-ms_struct.c index 14e7fde8b98..8cce4d79811 100644 --- a/clang/test/Sema/pragma-ms_struct.c +++ b/clang/test/Sema/pragma-ms_struct.c @@ -25,7 +25,7 @@ struct { } __attribute__((__ms_struct__)) t1; struct S { - double __attribute__((ms_struct)) d; // expected-warning {{'ms_struct' attribute only applies to struct, union or class}} + double __attribute__((ms_struct)) d; // expected-warning {{'ms_struct' attribute only applies to struct or union}} unsigned long bf_1 : 12; unsigned long : 0; unsigned long bf_2 : 12; @@ -36,7 +36,7 @@ enum A = 0, B, C -} __attribute__((ms_struct)) e1; // expected-warning {{'ms_struct' attribute only applies to struct, union or class}} +} __attribute__((ms_struct)) e1; // expected-warning {{'ms_struct' attribute only applies to struct or union}} // rdar://10513599 #pragma ms_struct on diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index 39aea1ce8e7..1a7d566ad00 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -1771,8 +1771,12 @@ static std::string CalculateDiagnostic(const Record &S) { case Type: return "ExpectedType"; case ObjCInterface: return "ExpectedObjectiveCInterface"; - // FIXME: This could be checking lang opts to remove class. - case Struct: return "ExpectedStructOrUnionOrClass"; + // "Struct" means struct, union or class; check the language options and if + // not compiling for C++, strip off the class part. Note that this relies + // on the fact that the context for this declares "Sema &S". + case Struct: + return "(S.getLangOpts().CPlusPlus ? ExpectedStructOrUnionOrClass : " + "ExpectedStructOrUnion)"; case Func | ObjCMethod | Block: return "ExpectedFunctionMethodOrBlock"; case Func | ObjCMethod | Class: return "ExpectedFunctionMethodOrClass"; case Func | Param: |