diff options
author | Nathan Huckleberry <nhuck@google.com> | 2019-07-26 17:29:35 +0000 |
---|---|---|
committer | Nathan Huckleberry <nhuck@google.com> | 2019-07-26 17:29:35 +0000 |
commit | 2e040398f8d691cc378c1abb098824ff49f3f28f (patch) | |
tree | fc471cad581f4792b88c78feac0ec9eed62e7587 /clang/lib/Sema/SemaDecl.cpp | |
parent | 9df6177d380ecd0e9d78361a938664dc3a0ee387 (diff) | |
download | bcm5719-llvm-2e040398f8d691cc378c1abb098824ff49f3f28f.tar.gz bcm5719-llvm-2e040398f8d691cc378c1abb098824ff49f3f28f.zip |
[Sema] Fix -Wuninitialized for struct assignment from GNU C statement expression
Summary:
Do not automatically report self references of structs in statement expression
as warnings. Instead wait for uninitialized cfg analysis.
https://bugs.llvm.org/show_bug.cgi?id=42604
Reviewers: aaron.ballman, rsmith, nickdesaulniers
Reviewed By: aaron.ballman, nickdesaulniers
Subscribers: nathanchance, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D64678
llvm-svn: 367134
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 1c7b2b0ae27..2e82dcf4ac8 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -11257,9 +11257,12 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) { // Check for self-references within variable initializers. // Variables declared within a function/method body (except for references) // are handled by a dataflow analysis. - if (!VDecl->hasLocalStorage() || VDecl->getType()->isRecordType() || - VDecl->getType()->isReferenceType()) { - CheckSelfReference(*this, RealDecl, Init, DirectInit); + // This is undefined behavior in C++, but valid in C. + if (getLangOpts().CPlusPlus) { + if (!VDecl->hasLocalStorage() || VDecl->getType()->isRecordType() || + VDecl->getType()->isReferenceType()) { + CheckSelfReference(*this, RealDecl, Init, DirectInit); + } } // If the type changed, it means we had an incomplete type that was |