Index: clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp +++ clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp @@ -92,6 +92,19 @@ } } else if (const auto *VD = Result.Nodes.getNodeAs("Mark")) { const QualType T = VD->getType(); + if (T->isRecordType()) { + if (const auto *ILE = dyn_cast_or_null(VD->getInit())) { + const auto *D = T->getAs()->getDecl(); + unsigned InitNr = 0U; + for (const auto *F : D->fields()) { + if (InitNr >= ILE->getNumInits()) + break; + const auto *Init = ILE->getInit(InitNr++); + if (!F->getType().isConstQualified()) + markCanNotBeConst(Init, true); + } + } + } if ((T->isPointerType() && !T->getPointeeType().isConstQualified()) || T->isArrayType()) markCanNotBeConst(VD->getInit(), true); Index: clang-tools-extra/test/clang-tidy/checkers/readability-non-const-parameter.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability-non-const-parameter.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability-non-const-parameter.cpp @@ -217,11 +217,20 @@ // Don't warn about nonconst record pointers that can be const. struct XY { int *x; - int *y; + const int *y; }; void recordpointer(struct XY *xy) { *(xy->x) = 0; } +// CHECK-MESSAGES: :[[@LINE+1]]:21: warning: pointer parameter 'y' can be +void initlist1(int *y) { + // CHECK-FIXES: {{^}}void initlist1(const int *y) {{{$}} + XY xy = {nullptr, y}; +} +// Don't warn when pointer is assigned to non-const struct member. +void initlist2(int *x) { + XY xy = {x}; +} class C { public: