diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-23 20:55:32 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-23 20:55:32 +0000 |
commit | 51bebc83e74001ed0412d82aadae9eb247fee2d4 (patch) | |
tree | 57a7c5823fb7daed74616f8bb5fbd2020bc2d4d1 /lib/Sema/SemaDeclCXX.cpp | |
parent | f7469a38ca835681a64959d71c4792d93a7b1d00 (diff) |
This patch addresses a few issues related to 8.5.3 [dcl.init.ref]
It uses a recent API to find inherited conversion functions to do
the initializer to reference lvalue conversion (and removes a FIXME).
It issues the ambiguity diagnostics when multiple conversions are found.
WIP.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82649 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 1896fb0dc3..a4679e0e28 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -3478,7 +3478,7 @@ Sema::CheckReferenceInit(Expr *&Init, QualType DeclType, OverloadCandidateSet CandidateSet; OverloadedFunctionDecl *Conversions - = T2RecordDecl->getConversionFunctions(); + = T2RecordDecl->getVisibleConversionFunctions(); for (OverloadedFunctionDecl::function_iterator Func = Conversions->function_begin(); Func != Conversions->function_end(); ++Func) { @@ -3489,7 +3489,7 @@ Sema::CheckReferenceInit(Expr *&Init, QualType DeclType, Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); else Conv = cast<CXXConversionDecl>(*Func); - + // If the conversion function doesn't return a reference type, // it can't be considered for this conversion. if (Conv->getConversionType()->isLValueReferenceType() && @@ -3688,7 +3688,27 @@ Sema::CheckReferenceInit(Expr *&Init, QualType DeclType, } return ICS->ConversionKind == ImplicitConversionSequence::BadConversion; } else { - return PerformImplicitConversion(Init, T1, "initializing"); + ImplicitConversionSequence Conversions; + bool badConversion = PerformImplicitConversion(Init, T1, "initializing", + false, false, + Conversions); + if (badConversion) { + if ((Conversions.ConversionKind == + ImplicitConversionSequence::BadConversion) + && Conversions.ConversionFunctionSet.size() > 0) { + Diag(Init->getSourceRange().getBegin(), + diag::err_lvalue_to_rvalue_ambig_ref) << Init->getSourceRange(); + for (int j = Conversions.ConversionFunctionSet.size()-1; + j >= 0; j--) { + FunctionDecl *Func = Conversions.ConversionFunctionSet[j]; + Diag(Func->getLocation(), diag::err_ovl_candidate); + } + } + else + Diag(Init->getSourceRange().getBegin(), diag::err_lvalue_to_rvalue_ref) + << Init->getSourceRange(); + } + return badConversion; } } |