summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2016-01-11 22:41:53 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2016-01-11 22:41:53 +0000
commit38c202e97e51de7d4f2b523e15fa56c8c1a494cd (patch)
tree69d2c3e45dc2aaa5dadbd442df4ab2e8cb966b33 /clang/lib/Sema/SemaDecl.cpp
parent0fb7ed5726f1470f6e117f72ed629fad74862187 (diff)
downloadbcm5719-llvm-38c202e97e51de7d4f2b523e15fa56c8c1a494cd.tar.gz
bcm5719-llvm-38c202e97e51de7d4f2b523e15fa56c8c1a494cd.zip
When a tag is declared in prototype scope in C, if we've decided that it
redeclares an existing tag but are creating a new declaration anyway (because it has attributes or changes the visibility of the name), don't warn that it won't be visible outside the current scope. That's not true. Also narrow down the set of cases where we create these extra declarations when building modules; previously, all tag declarations but the first in a module header would get this treatment if -fmodules-local-submodule-visibility. (This isn't a functional change, but we try to avoid creating these extra declarations whenever we can.) llvm-svn: 257403
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 66c0e059d4b..f95d1068cc5 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -12316,7 +12316,8 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
} else if (TUK == TUK_Reference &&
(PrevTagDecl->getFriendObjectKind() ==
Decl::FOK_Undeclared ||
- getOwningModule(PrevDecl) !=
+ PP.getModuleContainingLocation(
+ PrevDecl->getLocation()) !=
PP.getModuleContainingLocation(KWLoc)) &&
SS.isEmpty()) {
// This declaration is a reference to an existing entity, but
@@ -12326,8 +12327,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
// the declaration would have meant the same thing if no prior
// declaration were found, that is, if it was found in the same
// scope where we would have injected a declaration.
- if (!getTagInjectionContext(CurContext)
- ->getRedeclContext()
+ if (!getTagInjectionContext(CurContext)->getRedeclContext()
->Equals(PrevDecl->getDeclContext()->getRedeclContext()))
return PrevTagDecl;
// This is in the injected scope, create a new declaration in
@@ -12634,7 +12634,7 @@ CreateNewDecl:
<< Name;
Invalid = true;
}
- } else {
+ } else if (!PrevDecl) {
Diag(Loc, diag::warn_decl_in_param_list) << Context.getTagDeclType(New);
}
DeclsInPrototypeScope.push_back(New);
OpenPOWER on IntegriCloud