summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2012-09-05 17:52:12 +0000
committerFariborz Jahanian <fjahanian@apple.com>2012-09-05 17:52:12 +0000
commitaaf376b4dd9a75bc8c3a7da65b7acfea68c53eb1 (patch)
treecc851ddb3838b81949fb5b6a30a505ef337b8d35
parent6d92188ff75e7ea12fc2014c4ce0235c822b9393 (diff)
downloadbcm5719-llvm-aaf376b4dd9a75bc8c3a7da65b7acfea68c53eb1.tar.gz
bcm5719-llvm-aaf376b4dd9a75bc8c3a7da65b7acfea68c53eb1.zip
c error recovery. treat an invalid redeclaration
of a c-function for what it is. Otherwise, this func is treated as an overloadable c-function resulting in a crash much later. // rdar://11743706 llvm-svn: 163224
-rw-r--r--clang/lib/Sema/SemaDecl.cpp3
-rw-r--r--clang/test/Sema/invalid-decl.c9
2 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 2582e132482..6fff4b15a47 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -5565,6 +5565,9 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
D.setRedeclaration(CheckFunctionDeclaration(S, NewFD, Previous,
isExplicitSpecialization));
}
+ // Make graceful recovery from an invalid redeclaration.
+ else if (!Previous.empty())
+ D.setRedeclaration(true);
assert((NewFD->isInvalidDecl() || !D.isRedeclaration() ||
Previous.getResultKind() != LookupResult::FoundOverloaded) &&
"previous declaration set still overloaded");
diff --git a/clang/test/Sema/invalid-decl.c b/clang/test/Sema/invalid-decl.c
index 2699b254926..b2c2aaf1a0f 100644
--- a/clang/test/Sema/invalid-decl.c
+++ b/clang/test/Sema/invalid-decl.c
@@ -29,3 +29,12 @@ typedef struct {
void f(StructType *buf) {
buf->fun = 0;
}
+
+// rdar://11743706
+static void bar(hid_t, char); // expected-error {{expected identifier}}
+
+static void bar(hid_t p, char); // expected-error {{unknown type name 'hid_t'}}
+
+void foo() {
+ (void)bar;
+}
OpenPOWER on IntegriCloud