summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2013-12-04 15:32:26 +0000
committerAaron Ballman <aaron@aaronballman.com>2013-12-04 15:32:26 +0000
commit66037479af2ac686d8d9304129643a95decfb1c0 (patch)
treeaca983c18c6c96d81e8bb00e00f0573e282dba80 /clang
parentc5f420e129ef0bf767e394b83906946d181a4537 (diff)
downloadbcm5719-llvm-66037479af2ac686d8d9304129643a95decfb1c0.tar.gz
bcm5719-llvm-66037479af2ac686d8d9304129643a95decfb1c0.zip
When parsing ignored attribute arguments, presuming the first argument is an unresolved identifier the same way that we do for unknown arguments. This resolves PR18075, where we regressed the handling of OpenBSD's bounded attribute.
llvm-svn: 196387
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Parse/ParseDecl.cpp3
-rw-r--r--clang/test/Sema/attr-bounded.c15
2 files changed, 17 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 4fce10fc32f..944942658ab 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -288,7 +288,8 @@ void Parser::ParseGNUAttributeArgs(IdentifierInfo *AttrName,
// If we don't know how to parse this attribute, but this is the only
// token in this argument, assume it's meant to be an identifier.
- if (AttrKind == AttributeList::UnknownAttribute) {
+ if (AttrKind == AttributeList::UnknownAttribute ||
+ AttrKind == AttributeList::IgnoredAttribute) {
const Token &Next = NextToken();
IsIdentifierArg = Next.is(tok::r_paren) || Next.is(tok::comma);
}
diff --git a/clang/test/Sema/attr-bounded.c b/clang/test/Sema/attr-bounded.c
new file mode 100644
index 00000000000..bf71fedf2d3
--- /dev/null
+++ b/clang/test/Sema/attr-bounded.c
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -fsyntax-only %s
+// Make sure OpenBSD's bounded extension is accepted.
+
+typedef long ssize_t;
+typedef unsigned long size_t;
+typedef struct FILE FILE;
+
+ssize_t read(int, void *, size_t)
+ __attribute__((__bounded__(__buffer__,2,3)));
+int readlink(const char *, char *, size_t)
+ __attribute__((__bounded__(__string__,2,3)));
+size_t fread(void *, size_t, size_t, FILE *)
+ __attribute__((__bounded__(__size__,1,3,2)));
+char *getwd(char *)
+ __attribute__((__bounded__(__minbytes__,1,1024))); \ No newline at end of file
OpenPOWER on IntegriCloud