Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2366,6 +2366,10 @@ "cannot use __auto_type with initializer list in C">; def err_auto_bitfield : Error< "cannot pass bit-field as __auto_type initializer in C">; +def warn_auto_creates_copy : Warning< + "initialization of %0 creates a value copy of the retuned reference;" + " did you mean '&'?">, + InGroup>; // C++1y decltype(auto) type def err_decltype_auto_invalid : Error< Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -12263,8 +12263,14 @@ } Init = Res.get(); + QualType OrigTy = VDecl->getType(); if (DeduceVariableDeclarationType(VDecl, DirectInit, Init)) return; + + if (!DirectInit && isa(Init) && OrigTy->isUndeducedAutoType() && + OrigTy.isLocalConstQualified() && Init->getValueKind() == VK_LValue && + isa(Init->getType())) + Diag(VDecl->getLocation(), diag::warn_auto_creates_copy) << VDecl; } // dllimport cannot be used on variable definitions. Index: clang/test/SemaCXX/warn-auto-value-copy.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/warn-auto-value-copy.cpp @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -verify -fsyntax-only %s + +struct Big { + Big(Big const &) noexcept; + unsigned r[50]; +}; + +Big &RFn(); +Big &(*RPtr)(); + +const Big &CRFn(); +const Big CVFn(); + +Big VFn(); +int &SR(); + +void f() { + auto const copy1 = RFn(); // expected-warning{{a value copy of}} + auto const copy2 = RPtr(); // expected-warning{{a value copy of}} + auto const copy3 = CRFn(); // expected-warning{{a value copy of}} + + auto const paren1(RFn()); // paren-init + auto const brace1{RPtr()}; // brace-init + + auto const ok1 = VFn(); // by-value + auto const ok2 = CVFn(); // by-value + auto const ok3 = SR(); // non-class +}