]> granicus.if.org Git - clang/commitdiff
Add support for the Microsoft uuid attribute:
authorFrancois Pichet <pichet2000@gmail.com>
Sun, 19 Dec 2010 06:50:37 +0000 (06:50 +0000)
committerFrancois Pichet <pichet2000@gmail.com>
Sun, 19 Dec 2010 06:50:37 +0000 (06:50 +0000)
example:
struct __declspec(uuid("6d5140c1-7436-11ce-8034-00aa006009fa"))
test { };

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122173 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/Attr.td
include/clang/Sema/AttributeList.h
lib/Sema/AttributeList.cpp
lib/Sema/SemaDeclAttr.cpp

index afd476372a04be6e12beb26e7ef25813e97b3364..cd5dc214096e8ccf2eab7d47886a34ac6dcc2018 100644 (file)
@@ -422,6 +422,12 @@ def Used : Attr {
   let Spellings = ["used"];
 }
 
+def Uuid : Attr {
+  let Spellings = ["uuid"];
+  let Args = [StringArgument<"Guid">];
+  let Subjects = [CXXRecord];
+}
+
 def Visibility : Attr {
   let Spellings = ["visibility"];
   let Args = [EnumArgument<"Visibility", "VisibilityType",
index d524861287586f730cfe9a5258e959bd824eba88..69170fa23ce5c0d7f3f4bef6496ec2a94e70f9ff 100644 (file)
@@ -148,6 +148,7 @@ public:
     AT_unavailable,
     AT_unused,
     AT_used,
+    AT_uuid,
     AT_vecreturn,     // PS3 PPU-specific.
     AT_vector_size,
     AT_visibility,
index 789c17b7f0a6a608b675cb7ce0d74e141eb0d3ac..6aa9690476aab33d37fbdafa491ba3bcc73086c4 100644 (file)
@@ -133,5 +133,6 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
     .Case("launch_bounds", AT_launch_bounds)
     .Case("common", AT_common)
     .Case("nocommon", AT_nocommon)
+    .Case("uuid", AT_uuid)
     .Default(UnknownAttribute);
 }
index e9f885e62f30ecf7fce5ae71f2ab79d8bb5d811d..b0e022fd335c382b0827da988549b6eb8e296354 100644 (file)
@@ -2516,7 +2516,29 @@ static void HandleNSReturnsRetainedAttr(Decl *d, const AttributeList &Attr,
 
 static bool isKnownDeclSpecAttr(const AttributeList &Attr) {
   return Attr.getKind() == AttributeList::AT_dllimport ||
-         Attr.getKind() == AttributeList::AT_dllexport;
+         Attr.getKind() == AttributeList::AT_dllexport ||
+         Attr.getKind() == AttributeList::AT_uuid;
+}
+
+//===----------------------------------------------------------------------===//
+// Microsoft specific attribute handlers.
+//===----------------------------------------------------------------------===//
+
+static void HandleUuidAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+  if (S.LangOpts.Microsoft || S.LangOpts.Borland) {
+    // check the attribute arguments.
+    if (Attr.getNumArgs() != 1) {
+      S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+      return;
+    }
+    Expr *Arg = Attr.getArg(0);
+    StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
+
+    d->addAttr(::new (S.Context) UuidAttr(Attr.getLoc(), S.Context, 
+                                          Str->getString()));
+  } else {
+    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "uuid";
+  }
 }
 
 //===----------------------------------------------------------------------===//
@@ -2646,6 +2668,9 @@ static void ProcessDeclAttribute(Scope *scope, Decl *D,
   case AttributeList::AT_pascal:
     HandleCallConvAttr(D, Attr, S);
     break;
+  case AttributeList::AT_uuid:
+    HandleUuidAttr(D, Attr, S);
+    break;
   default:
     // Ask target about the attribute.
     const TargetAttributesSema &TargetAttrs = S.getTargetAttributesSema();