Patch for AST representation for the implicit conversion to a function

reference/pointer. And a test case for code gen.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83000 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Fariborz Jahanian 2009-09-28 18:35:46 +00:00
Родитель 1bffabaa35
Коммит d8307b1033
3 изменённых файлов: 59 добавлений и 7 удалений

Просмотреть файл

@ -4883,12 +4883,18 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Object,
// We selected one of the surrogate functions that converts the
// object parameter to a function pointer. Perform the conversion
// on the object argument, then let ActOnCallExpr finish the job.
// FIXME: Represent the user-defined conversion in the AST!
ImpCastExprToType(Object,
Conv->getConversionType().getNonReferenceType(),
CastExpr::CK_Unknown,
Conv->getConversionType()->isLValueReferenceType());
return ActOnCallExpr(S, ExprArg(*this, Object), LParenLoc,
// Create an implicit member expr to refer to the conversion operator.
MemberExpr *ME =
new (Context) MemberExpr(Object, /*IsArrow=*/false, Conv,
SourceLocation(), Conv->getType());
QualType ResultType = Conv->getConversionType().getNonReferenceType();
CXXMemberCallExpr *CE =
new (Context) CXXMemberCallExpr(Context, ME, 0, 0,
ResultType,
SourceLocation());
return ActOnCallExpr(S, ExprArg(*this, CE), LParenLoc,
MultiExprArg(*this, (ExprTy**)Args, NumArgs),
CommaLocs, RParenLoc).release();
}

Просмотреть файл

@ -0,0 +1,47 @@
// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s &&
// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s &&
// RUN: clang-cc -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s &&
// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s &&
// RUN: true
extern "C" int printf(...);
int f1(int arg) { return arg; };
int f2(float arg) { return int(arg); };
typedef int (*fp1)(int);
typedef int (*fp2)(float);
struct A {
operator fp1() { return f1; }
operator fp2() { return f2; }
} a;
// Test for function reference.
typedef int (&fr1)(int);
typedef int (&fr2)(float);
struct B {
operator fr1() { return f1; }
operator fr2() { return f2; }
} b;
int main()
{
int i = a(10); // Calls f1 via pointer returned from conversion function
printf("i = %d\n", i);
int j = b(20); // Calls f1 via pointer returned from conversion function
printf("j = %d\n", j);
return 0;
}
// CHECK-LP64: call __ZN1AcvPFiiEEv
// CHECK-LP64: call __ZN1BcvRFiiEEv
// CHECK-LP32: call L__ZN1AcvPFiiEEv
// CHECK-LP32: call L__ZN1BcvRFiiEEv

Просмотреть файл

@ -1605,7 +1605,6 @@ welcome!</p>
<td class="medium" align="center"></td>
<td class="advanced" align="center"></td>
<td class="na" align="center">N/A</td>
<td>Missing AST representation for the implicit conversion to a function reference/pointer</td>
</tr>
<tr>
<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13.3.1.2 [over.match.oper]</td>