]> granicus.if.org Git - clang/commitdiff
Fix attribute between function decl ')' and '{' or '=0'
authorJohn Thompson <John.Thompson.JTSoftware@gmail.com>
Wed, 25 Nov 2009 22:58:06 +0000 (22:58 +0000)
committerJohn Thompson <John.Thompson.JTSoftware@gmail.com>
Wed, 25 Nov 2009 22:58:06 +0000 (22:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89894 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseDeclCXX.cpp
test/Parser/attributes.c
test/Parser/cxx-attributes.cpp [new file with mode: 0644]

index 59cb90d6d05402565f73b627f89e34d7807d91c6..505a4d800ded40db310b22f9bc868e09bf34549a 100644 (file)
@@ -1144,6 +1144,13 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
       return;
     }
 
+    // If attributes exist after the declarator, but before an '{', parse them.
+    if (Tok.is(tok::kw___attribute)) {
+      SourceLocation Loc;
+      AttributeList *AttrList = ParseGNUAttributes(&Loc);
+      DeclaratorInfo.AddAttributes(AttrList, Loc);
+    }
+
     // function-definition:
     if (Tok.is(tok::l_brace)
         || (DeclaratorInfo.isFunctionDeclarator() &&
index dc2bb02670c63a3beca411dd35cc466973838098..cad39d382d18a6c88470cd967aa7a15560f9301b 100644 (file)
@@ -51,3 +51,4 @@ int foo42(void) {
 // rdar://6096491
 void __attribute__((noreturn)) d0(void), __attribute__((noreturn)) d1(void);
 
+void d2(void) __attribute__((noreturn)), d3(void) __attribute__((noreturn));
diff --git a/test/Parser/cxx-attributes.cpp b/test/Parser/cxx-attributes.cpp
new file mode 100644 (file)
index 0000000..743d9b9
--- /dev/null
@@ -0,0 +1,9 @@
+// RUN: clang-cc -fsyntax-only -verify %s\r
+\r
+class c {\r
+  virtual void f1(const char* a, ...)\r
+    __attribute__ (( __format__(__printf__,2,3) )) = 0;\r
+  virtual void f2(const char* a, ...)\r
+    __attribute__ (( __format__(__printf__,2,3) )) {}\r
+};\r
+\r