diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-07-07 17:00:05 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-07-07 17:00:05 +0000 |
commit | 2074977695fec92e0c966d9fd85f56ababec637b (patch) | |
tree | 3fd30563f8b9e5dcaf921990b701129a5125b90f | |
parent | 5723bd43d3ac3c54ce2f07f9873d7b689e477306 (diff) | |
download | bcm5719-llvm-2074977695fec92e0c966d9fd85f56ababec637b.tar.gz bcm5719-llvm-2074977695fec92e0c966d9fd85f56ababec637b.zip |
Tighten up the conditions under which we build an implicit function
declaration for a builtin.
llvm-svn: 74917
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 9 | ||||
-rw-r--r-- | clang/test/Sema/implicit-builtin-redecl.c | 12 |
2 files changed, 18 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a1ab68ac2a8..85210f049d2 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1431,15 +1431,18 @@ Sema::HandleDeclarator(Scope *S, Declarator &D, if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) /* Do nothing*/; else if (R->isFunctionType()) { - if (CurContext->isFunctionOrMethod()) + if (CurContext->isFunctionOrMethod() || + D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_static) NameKind = LookupRedeclarationWithLinkage; } else if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_extern) NameKind = LookupRedeclarationWithLinkage; + else if (CurContext->getLookupContext()->isTranslationUnit() && + D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_static) + NameKind = LookupRedeclarationWithLinkage; DC = CurContext; PrevDecl = LookupName(S, Name, NameKind, true, - D.getDeclSpec().getStorageClassSpec() != - DeclSpec::SCS_static, + NameKind == LookupRedeclarationWithLinkage, D.getIdentifierLoc()); } else { // Something like "int foo::x;" DC = computeDeclContext(D.getCXXScopeSpec()); diff --git a/clang/test/Sema/implicit-builtin-redecl.c b/clang/test/Sema/implicit-builtin-redecl.c index cd99b545531..36513bafb05 100644 --- a/clang/test/Sema/implicit-builtin-redecl.c +++ b/clang/test/Sema/implicit-builtin-redecl.c @@ -12,3 +12,15 @@ void *calloc(int, int, int); // expected-warning{{incompatible redeclaration of void f1(void) { calloc(0, 0, 0); } + +void f2() { + int index = 1; +} + +static int index; + +int f3() { + return index << 2; +} + +typedef int rindex;
\ No newline at end of file |