[PATCH] D52879: Derive builtin return type from its definition
Bruno Ricci via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 30 08:59:42 PST 2018
riccibruno added a comment.
In D52879#1314694 <https://reviews.llvm.org/D52879#1314694>, @mantognini wrote:
> In D52879#1311177 <https://reviews.llvm.org/D52879#1311177>, @riccibruno wrote:
>
> > And moreover I believe this change is subtly incorrect for the following reason:
> > The type that is passed into the constructor of the call expression is the type
> > of the call expression, and not the return type.
> >
> > The difference between the return type and the type of the call expression is that
> > 1.) References are dropped, and
> > 2.) For C++: The cv-qualifiers of non class pr-values are dropped,
> > 3.) For C: The cv-qualifiers are dropped.
> >
> > ( as can be seen in `FunctionType::getCallResultType` )
>
>
> Could you clarify one thing for me: If I understood what you were saying, the type passed to CallExpr should not be ref-cv-qualified, is that right?
>
> In that case, couldn't we "simply" remove the ref + CV-qualifiers from ReturnTy? (`getNonReferenceType().withoutLocalFastQualifiers()`)
>
> Note: I cannot revert this //and// keep the test because the new ones will fail.
It's not that simple unfortunately. The type passed to `CallExpr` is the type of the call expression,
which is different from the return type. However you can just use `FunctionType::getCallResultType`.
================
Comment at: lib/Sema/SemaExpr.cpp:5550
ExprResult Result;
+ QualType ReturnTy;
if (BuiltinID &&
----------------
Please rename this to something more appropriate,
like `ResultTy` or similar.
================
Comment at: lib/Sema/SemaExpr.cpp:5553
Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
- Result = ImpCastExprToType(Fn, Context.getPointerType(FDecl->getType()),
- CK_BuiltinFnToFnPtr).get();
+ // Extract the return type from the (builtin) function pointer type.
+ auto FnPtrTy = Context.getPointerType(FDecl->getType());
----------------
Please leave a FIXME indicating that someone should
go through each of the builtins and remove the
various `setType` when appropriate.
================
Comment at: lib/Sema/SemaExpr.cpp:5554
+ // Extract the return type from the (builtin) function pointer type.
+ auto FnPtrTy = Context.getPointerType(FDecl->getType());
+ Result = ImpCastExprToType(Fn, FnPtrTy, CK_BuiltinFnToFnPtr).get();
----------------
Don't use `auto` here.
================
Comment at: lib/Sema/SemaExpr.cpp:5556
+ Result = ImpCastExprToType(Fn, FnPtrTy, CK_BuiltinFnToFnPtr).get();
+ auto FnTy = FnPtrTy->getPointeeType()->castAs<FunctionType>();
+ ReturnTy = FnTy->getReturnType();
----------------
`const auto *` or just spell the type.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D52879/new/
https://reviews.llvm.org/D52879
More information about the cfe-commits
mailing list