aaron.ballman created this revision. aaron.ballman added reviewers: rsmith, george.karpenkov. Herald added subscribers: kristof.beyls, javed.absar.
This patch changes the way we handle `-Wshadow-field` so that we do not issue diagnostics for parameters in function declarations (as those are harmless), but we continue to diagnose parameters of function definitions. https://reviews.llvm.org/D55321 Files: lib/Sema/SemaChecking.cpp lib/Sema/SemaDecl.cpp test/SemaCXX/warn-shadow.cpp Index: test/SemaCXX/warn-shadow.cpp =================================================================== --- test/SemaCXX/warn-shadow.cpp +++ test/SemaCXX/warn-shadow.cpp @@ -233,6 +233,7 @@ void E() { extern void f(int B); // Ok } + void F(int B); // Ok, declaration; not definition. }; class Private { Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -12427,13 +12427,6 @@ D.setInvalidType(true); } } - - if (LangOpts.CPlusPlus) { - DeclarationNameInfo DNI = GetNameForDeclarator(D); - if (auto *RD = dyn_cast<CXXRecordDecl>(CurContext)) - CheckShadowInheritedFields(DNI.getLoc(), DNI.getName(), RD, - /*DeclIsField*/ false); - } } // Temporarily put parameter variables in the translation unit, not Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -12141,6 +12141,18 @@ if (!Param->getType().isConstQualified()) Diag(Param->getLocation(), diag::err_attribute_pointers_only) << Attr->getSpelling() << 1; + + // Check for parameter names shadowing fields from the class. + if (LangOpts.CPlusPlus && !Param->isInvalidDecl()) { + // The owning context for the parameter should be the function, but we + // want to see if this function's declaration context is a record. + DeclContext *DC = Param->getDeclContext(); + if (DC && DC->isFunctionOrMethod()) { + if (auto *RD = dyn_cast<CXXRecordDecl>(DC->getParent())) + CheckShadowInheritedFields(Param->getLocation(), Param->getDeclName(), + RD, /*DeclIsField*/ false); + } + } } return HasInvalidParm;
Index: test/SemaCXX/warn-shadow.cpp =================================================================== --- test/SemaCXX/warn-shadow.cpp +++ test/SemaCXX/warn-shadow.cpp @@ -233,6 +233,7 @@ void E() { extern void f(int B); // Ok } + void F(int B); // Ok, declaration; not definition. }; class Private { Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -12427,13 +12427,6 @@ D.setInvalidType(true); } } - - if (LangOpts.CPlusPlus) { - DeclarationNameInfo DNI = GetNameForDeclarator(D); - if (auto *RD = dyn_cast<CXXRecordDecl>(CurContext)) - CheckShadowInheritedFields(DNI.getLoc(), DNI.getName(), RD, - /*DeclIsField*/ false); - } } // Temporarily put parameter variables in the translation unit, not Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -12141,6 +12141,18 @@ if (!Param->getType().isConstQualified()) Diag(Param->getLocation(), diag::err_attribute_pointers_only) << Attr->getSpelling() << 1; + + // Check for parameter names shadowing fields from the class. + if (LangOpts.CPlusPlus && !Param->isInvalidDecl()) { + // The owning context for the parameter should be the function, but we + // want to see if this function's declaration context is a record. + DeclContext *DC = Param->getDeclContext(); + if (DC && DC->isFunctionOrMethod()) { + if (auto *RD = dyn_cast<CXXRecordDecl>(DC->getParent())) + CheckShadowInheritedFields(Param->getLocation(), Param->getDeclName(), + RD, /*DeclIsField*/ false); + } + } } return HasInvalidParm;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits