summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2014-11-12 03:52:25 +0000
committerNico Weber <nicolasweber@gmx.de>2014-11-12 03:52:25 +0000
commit28309185b28034edc1b54c4e2a01c399f5097f28 (patch)
treed35334799de7cf1ba0fd80b563f0245c93aa2fa0 /clang
parentaa0117c628d8e3ccd0a3c055d8faaa01768389af (diff)
downloadbcm5719-llvm-28309185b28034edc1b54c4e2a01c399f5097f28.tar.gz
bcm5719-llvm-28309185b28034edc1b54c4e2a01c399f5097f28.zip
Mark TypeDecls used in member initializers as referenced.
Without this, -Wunused-local-typedef would incorrectly warn on the two typedefs in this program: void foo() { struct A {}; struct B : public A { typedef A INHERITED; B() : INHERITED() {} typedef B SELF; B(int) : SELF() {} }; } llvm-svn: 221765
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp1
-rw-r--r--clang/test/SemaCXX/warn-unused-local-typedef.cpp12
2 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index f9f9d3ff94e..d4cb2fe3504 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -2914,6 +2914,7 @@ Sema::BuildMemInitializer(Decl *ConstructorD,
if (BaseType.isNull()) {
BaseType = Context.getTypeDeclType(TyD);
+ MarkAnyDeclReferenced(TyD->getLocation(), TyD, /*OdrUse=*/false);
if (SS.isSet())
// FIXME: preserve source range information
BaseType = Context.getElaboratedType(ETK_None, SS.getScopeRep(),
diff --git a/clang/test/SemaCXX/warn-unused-local-typedef.cpp b/clang/test/SemaCXX/warn-unused-local-typedef.cpp
index e4434276721..1ef0ebfe1ac 100644
--- a/clang/test/SemaCXX/warn-unused-local-typedef.cpp
+++ b/clang/test/SemaCXX/warn-unused-local-typedef.cpp
@@ -213,5 +213,17 @@ void sneaky_memfun_h() {
sneaky_memfun_g(sneaky_memfun());
}
+void typedefs_in_constructors() {
+ struct A {};
+ struct B : public A {
+ // Neither of these two should warn:
+ typedef A INHERITED;
+ B() : INHERITED() {}
+
+ typedef B SELF;
+ B(int) : SELF() {}
+ };
+}
+
// This should not disable any warnings:
#pragma clang diagnostic ignored "-Wunused-local-typedef"
OpenPOWER on IntegriCloud