From ff8819be64c53d71dcc0200ece9b2738041c80e2 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Tue, 21 Sep 2010 10:47:20 +0000 Subject: [PATCH] Do not warn with -Wuninitialized when the member is used in a sizeof or address-of expression. Fixes rdar://8331312. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114426 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclCXX.cpp | 8 ++++++++ test/SemaCXX/constructor-initializer.cpp | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 4efb62a9d4..00f71a2bd4 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1246,6 +1246,14 @@ static bool InitExprContainsUninitializedFields(const Stmt *S, *L = ME->getMemberLoc(); return true; } + } else if (isa(S)) { + // sizeof/alignof doesn't reference contents, do not warn. + return false; + } else if (const UnaryOperator *UOE = dyn_cast(S)) { + // address-of doesn't reference contents (the pointer may be dereferenced + // in the same expression but it would be rare; and weird). + if (UOE->getOpcode() == UO_AddrOf) + return false; } for (Stmt::const_child_iterator it = S->child_begin(), e = S->child_end(); it != e; ++it) { diff --git a/test/SemaCXX/constructor-initializer.cpp b/test/SemaCXX/constructor-initializer.cpp index 31d53302bf..a74fbe1800 100644 --- a/test/SemaCXX/constructor-initializer.cpp +++ b/test/SemaCXX/constructor-initializer.cpp @@ -144,9 +144,13 @@ int IntWrapper(int i) { return 0; }; class InitializeUsingSelfExceptions { int A; int B; + int C; + void *P; InitializeUsingSelfExceptions(int B) : A(IntWrapper(A)), // Due to a conservative implementation, we do not report warnings inside function/ctor calls even though it is possible to do so. - B(B) {} // Not a warning; B is a local variable. + B(B), // Not a warning; B is a local variable. + C(sizeof(C)), // sizeof doesn't reference contents, do not warn + P(&P) {} // address-of doesn't reference contents (the pointer may be dereferenced in the same expression but it would be rare; and weird) }; class CopyConstructorTest { -- 2.40.0