Author: aaronballman Date: Wed Dec 5 10:56:57 2018 New Revision: 348400 URL: http://llvm.org/viewvc/llvm-project?rev=348400&view=rev Log: Do not check for parameters shadowing fields in function declarations.
We would issue a false-positive diagnostic for parameters in function declarations shadowing fields; we now only issue the diagnostic on a function definition instead. Modified: cfe/trunk/lib/Sema/SemaChecking.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/SemaCXX/warn-shadow.cpp Modified: cfe/trunk/lib/Sema/SemaChecking.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=348400&r1=348399&r2=348400&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) +++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Dec 5 10:56:57 2018 @@ -12141,6 +12141,18 @@ bool Sema::CheckParmsForFunctionDef(Arra 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; Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=348400&r1=348399&r2=348400&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Dec 5 10:56:57 2018 @@ -12427,13 +12427,6 @@ Decl *Sema::ActOnParamDeclarator(Scope * 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 Modified: cfe/trunk/test/SemaCXX/warn-shadow.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-shadow.cpp?rev=348400&r1=348399&r2=348400&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/warn-shadow.cpp (original) +++ cfe/trunk/test/SemaCXX/warn-shadow.cpp Wed Dec 5 10:56:57 2018 @@ -201,7 +201,7 @@ void avoidWarningWhenRedefining(int b) { typedef char l; // no warning or error. typedef char n; // no warning or error. - typedef char n; // no warning or error. + typedef char n; // no warning or error. using n=char; // no warning or error. } @@ -225,7 +225,7 @@ void f(int a) { namespace PR34120 { struct A { - int B; // expected-note {{declared here}} + int B; // expected-note 2 {{declared here}} }; class C : public A { @@ -233,8 +233,13 @@ class C : public A { void E() { extern void f(int B); // Ok } + void F(int B); // Ok, declaration; not definition. + void G(int B); }; +void C::G(int B) { // expected-warning {{parameter 'B' shadows member inherited from type 'A'}} +} + class Private { int B; }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits