diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-28 18:35:46 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-28 18:35:46 +0000 |
commit | d8307b1033ef52a1ae640691bc45052fddb07a69 (patch) | |
tree | 0aab29a6d2dd44757becde44bcbdfcf77749cbfa | |
parent | 1bffabaa357563607196b59d009bc3a12f19c032 (diff) |
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
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 18 | ||||
-rw-r--r-- | test/CodeGenCXX/convert-to-fptr.cpp | 47 | ||||
-rw-r--r-- | www/cxx_status.html | 1 |
3 files changed, 59 insertions, 7 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 8909d98e24..793041b9b7 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -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(); } diff --git a/test/CodeGenCXX/convert-to-fptr.cpp b/test/CodeGenCXX/convert-to-fptr.cpp new file mode 100644 index 0000000000..c0bd2f7b85 --- /dev/null +++ b/test/CodeGenCXX/convert-to-fptr.cpp @@ -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 + diff --git a/www/cxx_status.html b/www/cxx_status.html index 8631352334..d2a403d213 100644 --- a/www/cxx_status.html +++ b/www/cxx_status.html @@ -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> 13.3.1.2 [over.match.oper]</td> |