diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2008-06-08 15:45:52 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2008-06-08 15:45:52 +0000 |
commit | b6f79538182462413595f9f0990b292fd9b21a41 (patch) | |
tree | 68bdf1169c4059d60ffa321cf97098cf7d35dc9e /clang/lib/Sema/SemaDecl.cpp | |
parent | 486c7d3fa50c1f1e7a3d2f5bbca29bc28b588f32 (diff) | |
download | bcm5719-llvm-b6f79538182462413595f9f0990b292fd9b21a41.tar.gz bcm5719-llvm-b6f79538182462413595f9f0990b292fd9b21a41.zip |
implement the alias attirbute (in both Sema and Codegen)
llvm-svn: 52092
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index b56622ceb9c..ed34f9fe00d 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -2250,6 +2250,9 @@ void Sema::HandleDeclAttribute(Decl *New, AttributeList *Attr) { } // FIXME: Diagnostic? break; + case AttributeList::AT_alias: + HandleAliasAttribute(New, Attr); + break; case AttributeList::AT_deprecated: HandleDeprecatedAttribute(New, Attr); break; @@ -2438,6 +2441,32 @@ void Sema::HandlePackedAttribute(Decl *d, AttributeList *rawAttr) { rawAttr->getName()->getName()); } +void Sema::HandleAliasAttribute(Decl *d, AttributeList *rawAttr) { + // check the attribute arguments. + if (rawAttr->getNumArgs() != 1) { + Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments, + std::string("1")); + return; + } + + Expr *Arg = static_cast<Expr*>(rawAttr->getArg(0)); + Arg = Arg->IgnoreParenCasts(); + StringLiteral *Str = dyn_cast<StringLiteral>(Arg); + + if (Str == 0 || Str->isWide()) { + Diag(rawAttr->getLoc(), diag::err_attribute_argument_n_not_string, + "alias", std::string("1")); + return; + } + + const char *Alias = Str->getStrData(); + unsigned AliasLen = Str->getByteLength(); + + // FIXME: check if target symbol exists in current file + + d->addAttr(new AliasAttr(std::string(Alias, AliasLen))); +} + void Sema::HandleNoReturnAttribute(Decl *d, AttributeList *rawAttr) { // check the attribute arguments. if (rawAttr->getNumArgs() != 0) { |