diff options
| author | John McCall <rjmccall@apple.com> | 2015-02-01 22:34:06 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2015-02-01 22:34:06 +0000 |
| commit | 2859258e2faf21a120a2e4ed096b9af092347ea7 (patch) | |
| tree | c5a0b24a4b56d90142a58c0dccdf58f332501990 /clang/lib/Sema | |
| parent | 53565c60e7dfe6cb7b7ba347298a0de87ed956af (diff) | |
| download | bcm5719-llvm-2859258e2faf21a120a2e4ed096b9af092347ea7.tar.gz bcm5719-llvm-2859258e2faf21a120a2e4ed096b9af092347ea7.zip | |
Allow objc_bridge(id) to be used on typedefs of [cv] void*.
rdar://19678874
llvm-svn: 227774
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 22df62bb731..80f141ef8d0 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3734,6 +3734,22 @@ static void handleObjCBridgeAttr(Sema &S, Scope *Sc, Decl *D, S.Diag(D->getLocStart(), diag::err_objc_attr_not_id) << Attr.getName() << 0; return; } + + // Typedefs only allow objc_bridge(id) and have some additional checking. + if (auto TD = dyn_cast<TypedefNameDecl>(D)) { + if (!Parm->Ident->isStr("id")) { + S.Diag(Attr.getLoc(), diag::err_objc_attr_typedef_not_id) + << Attr.getName(); + return; + } + + // Only allow 'cv void *'. + QualType T = TD->getUnderlyingType(); + if (!T->isVoidPointerType()) { + S.Diag(Attr.getLoc(), diag::err_objc_attr_typedef_not_void_pointer); + return; + } + } D->addAttr(::new (S.Context) ObjCBridgeAttr(Attr.getRange(), S.Context, Parm->Ident, |

