[cfe-commits] [PATCH] for bug 8230 (invalid casts to function references) for review only
Douglas Gregor
dgregor at apple.com
Sun Nov 7 19:43:55 PST 2010
On Oct 1, 2010, at 9:39 AM, Douglas Gregor wrote:
>
> On Sep 26, 2010, at 10:09 PM, Faisal Vali wrote:
>
>> http://llvm.org/bugs/show_bug.cgi?id=8230
>>
>> Doug you had reviewed an earlier rendition of this fix and had made
>> some suggestions which I took into account. Before I construct all
>> the test cases to conform to my error messages, could I have you
>> review this patch - and if you like the direction, I will resubmit a
>> final version with a test file with appropriate error messages for the
>> test suite. The current test file has to be executed outside the test
>> suite.
>
> Some comments...
>
> Index: include/clang/Basic/DiagnosticSemaKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticSemaKinds.td (revision 114784)
> +++ include/clang/Basic/DiagnosticSemaKinds.td (working copy)
> @@ -2377,6 +2377,12 @@
>
> // C++ casts
> // These messages adhere to the TryCast pattern: %0 is an int specifying the
> // cast type, %1 is the source type, %2 is the destination type.
> +def err_bad_reinterpret_cast_overload : Error<
> + "reinterpret_cast cannot resolve overloads: '%0'">;
>
> I find this wording a little awkward. Perhaps:
>
> "reinterpret_cast cannot resolve overloaded function %0 "
>
> ?
>
>
> @@ -491,8 +509,27 @@
>
> unsigned msg = diag::err_bad_cxx_cast_generic;
> if (TryStaticCast(Self, SrcExpr, DestType, /*CStyle*/false, OpRange, msg,
> Kind, BasePath) != TC_Success && msg != 0)
> - Self.Diag(OpRange.getBegin(), msg) << CT_Static
> + {
> + if ( SrcExpr->getType() == Self.Context.OverloadTy )
> + {
> + OverloadExpr* oe = OverloadExpr::find(SrcExpr).Expression;
> + NestedNameSpecifier* nns = oe->getQualifier();
> + std::string oe_name;
> + if (nns)
> + {
> + llvm::raw_string_ostream os(oe_name);
> + nns->print(os,PrintingPolicy(Self.getLangOptions()));
> + os.flush();
> + }
> + oe_name += oe->getName().getAsString();
> + Self.Diag(OpRange.getBegin(), diag::err_bad_static_cast_overload)
> + << oe_name << DestType << OpRange;
> + NoteAllOverloadCandidates(SrcExpr, Self);
> + }
> + else
> + Self.Diag(OpRange.getBegin(), msg) << CT_Static
> << SrcExpr->getType() << DestType << OpRange;
> + }
> else if (Kind == CK_Unknown || Kind == CK_BitCast)
> Self.CheckCastAlign(SrcExpr, DestType, OpRange);
> }
>
> I don't think we should go through so much effort to format oe_name. Instead, I suggest that we just print the normal name of the function, and then highlight the qualifier range.
>
> Otherwise, looks good!
FWIW, I committed a tweaked version of Faisal's patch in r118400. Thanks!
- Doug
More information about the cfe-commits
mailing list