blob: 5a40b1f8f20fc5ac783ff8d2ac7a9784a260a772 [file] [log] [blame]
Nick Lewycky5d9484d2013-01-24 01:12:16 +00001//===--- SemaOverload.cpp - C++ Overloading -------------------------------===//
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file provides Sema routines for C++ overloading.
11//
12//===----------------------------------------------------------------------===//
13
Chandler Carruth55fc8732012-12-04 09:13:33 +000014#include "clang/Sema/Overload.h"
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000015#include "clang/AST/ASTContext.h"
Douglas Gregora8f32e02009-10-06 17:59:45 +000016#include "clang/AST/CXXInheritance.h"
John McCall7cd088e2010-08-24 07:21:54 +000017#include "clang/AST/DeclObjC.h"
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000018#include "clang/AST/Expr.h"
Douglas Gregorf9eb9052008-11-19 21:05:33 +000019#include "clang/AST/ExprCXX.h"
John McCall0e800c92010-12-04 08:14:53 +000020#include "clang/AST/ExprObjC.h"
Douglas Gregoreb8f3062008-11-12 17:17:38 +000021#include "clang/AST/TypeOrdering.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000022#include "clang/Basic/Diagnostic.h"
Anders Carlssonb7906612009-08-26 23:45:07 +000023#include "clang/Basic/PartialDiagnostic.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000024#include "clang/Lex/Preprocessor.h"
25#include "clang/Sema/Initialization.h"
26#include "clang/Sema/Lookup.h"
27#include "clang/Sema/SemaInternal.h"
28#include "clang/Sema/Template.h"
29#include "clang/Sema/TemplateDeduction.h"
Douglas Gregor661b4932010-09-12 04:28:07 +000030#include "llvm/ADT/DenseSet.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000031#include "llvm/ADT/STLExtras.h"
Douglas Gregorbf3af052008-11-13 20:12:29 +000032#include "llvm/ADT/SmallPtrSet.h"
Richard Smithb8590f32012-05-07 09:03:25 +000033#include "llvm/ADT/SmallString.h"
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000034#include <algorithm>
35
36namespace clang {
John McCall2a7fb272010-08-25 05:32:35 +000037using namespace sema;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000038
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000039/// A convenience routine for creating a decayed reference to a function.
John Wiegley429bb272011-04-08 18:41:53 +000040static ExprResult
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000041CreateFunctionRefExpr(Sema &S, FunctionDecl *Fn, NamedDecl *FoundDecl,
42 bool HadMultipleCandidates,
Douglas Gregor5b8968c2011-07-15 16:25:15 +000043 SourceLocation Loc = SourceLocation(),
44 const DeclarationNameLoc &LocInfo = DeclarationNameLoc()){
Richard Smith82f145d2013-05-04 06:44:46 +000045 if (S.DiagnoseUseOfDecl(FoundDecl, Loc))
Faisal Valid570a922013-06-15 11:54:37 +000046 return ExprError();
47 // If FoundDecl is different from Fn (such as if one is a template
48 // and the other a specialization), make sure DiagnoseUseOfDecl is
49 // called on both.
50 // FIXME: This would be more comprehensively addressed by modifying
51 // DiagnoseUseOfDecl to accept both the FoundDecl and the decl
52 // being used.
53 if (FoundDecl != Fn && S.DiagnoseUseOfDecl(Fn, Loc))
Richard Smith82f145d2013-05-04 06:44:46 +000054 return ExprError();
John McCallf4b88a42012-03-10 09:33:50 +000055 DeclRefExpr *DRE = new (S.Context) DeclRefExpr(Fn, false, Fn->getType(),
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000056 VK_LValue, Loc, LocInfo);
57 if (HadMultipleCandidates)
58 DRE->setHadMultipleCandidates(true);
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000059
60 S.MarkDeclRefReferenced(DRE);
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000061
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000062 ExprResult E = S.Owned(DRE);
John Wiegley429bb272011-04-08 18:41:53 +000063 E = S.DefaultFunctionArrayConversion(E.take());
64 if (E.isInvalid())
65 return ExprError();
Benjamin Kramer3fe198b2012-08-23 21:35:17 +000066 return E;
John McCallf89e55a2010-11-18 06:31:45 +000067}
68
John McCall120d63c2010-08-24 20:38:10 +000069static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
70 bool InOverloadResolution,
Douglas Gregor14d0aee2011-01-27 00:58:17 +000071 StandardConversionSequence &SCS,
John McCallf85e1932011-06-15 23:02:42 +000072 bool CStyle,
73 bool AllowObjCWritebackConversion);
Sam Panzerd0125862012-08-16 02:38:47 +000074
Fariborz Jahaniand97f5582011-03-23 19:50:54 +000075static bool IsTransparentUnionStandardConversion(Sema &S, Expr* From,
76 QualType &ToType,
77 bool InOverloadResolution,
78 StandardConversionSequence &SCS,
79 bool CStyle);
John McCall120d63c2010-08-24 20:38:10 +000080static OverloadingResult
81IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType,
82 UserDefinedConversionSequence& User,
83 OverloadCandidateSet& Conversions,
84 bool AllowExplicit);
85
86
87static ImplicitConversionSequence::CompareKind
88CompareStandardConversionSequences(Sema &S,
89 const StandardConversionSequence& SCS1,
90 const StandardConversionSequence& SCS2);
91
92static ImplicitConversionSequence::CompareKind
93CompareQualificationConversions(Sema &S,
94 const StandardConversionSequence& SCS1,
95 const StandardConversionSequence& SCS2);
96
97static ImplicitConversionSequence::CompareKind
98CompareDerivedToBaseConversions(Sema &S,
99 const StandardConversionSequence& SCS1,
100 const StandardConversionSequence& SCS2);
101
102
103
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000104/// GetConversionCategory - Retrieve the implicit conversion
105/// category corresponding to the given implicit conversion kind.
Mike Stump1eb44332009-09-09 15:08:12 +0000106ImplicitConversionCategory
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000107GetConversionCategory(ImplicitConversionKind Kind) {
108 static const ImplicitConversionCategory
109 Category[(int)ICK_Num_Conversion_Kinds] = {
110 ICC_Identity,
111 ICC_Lvalue_Transformation,
112 ICC_Lvalue_Transformation,
113 ICC_Lvalue_Transformation,
Douglas Gregor43c79c22009-12-09 00:47:37 +0000114 ICC_Identity,
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000115 ICC_Qualification_Adjustment,
116 ICC_Promotion,
117 ICC_Promotion,
Douglas Gregor5cdf8212009-02-12 00:15:05 +0000118 ICC_Promotion,
119 ICC_Conversion,
120 ICC_Conversion,
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000121 ICC_Conversion,
122 ICC_Conversion,
123 ICC_Conversion,
124 ICC_Conversion,
125 ICC_Conversion,
Douglas Gregor15da57e2008-10-29 02:00:59 +0000126 ICC_Conversion,
Douglas Gregorf9201e02009-02-11 23:02:49 +0000127 ICC_Conversion,
Douglas Gregorfb4a5432010-05-18 22:42:18 +0000128 ICC_Conversion,
129 ICC_Conversion,
John McCallf85e1932011-06-15 23:02:42 +0000130 ICC_Conversion,
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000131 ICC_Conversion
132 };
133 return Category[(int)Kind];
134}
135
136/// GetConversionRank - Retrieve the implicit conversion rank
137/// corresponding to the given implicit conversion kind.
138ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind) {
139 static const ImplicitConversionRank
140 Rank[(int)ICK_Num_Conversion_Kinds] = {
141 ICR_Exact_Match,
142 ICR_Exact_Match,
143 ICR_Exact_Match,
144 ICR_Exact_Match,
145 ICR_Exact_Match,
Douglas Gregor43c79c22009-12-09 00:47:37 +0000146 ICR_Exact_Match,
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000147 ICR_Promotion,
148 ICR_Promotion,
Douglas Gregor5cdf8212009-02-12 00:15:05 +0000149 ICR_Promotion,
150 ICR_Conversion,
151 ICR_Conversion,
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000152 ICR_Conversion,
153 ICR_Conversion,
154 ICR_Conversion,
155 ICR_Conversion,
156 ICR_Conversion,
Douglas Gregor15da57e2008-10-29 02:00:59 +0000157 ICR_Conversion,
Douglas Gregorf9201e02009-02-11 23:02:49 +0000158 ICR_Conversion,
Douglas Gregorfb4a5432010-05-18 22:42:18 +0000159 ICR_Conversion,
160 ICR_Conversion,
Fariborz Jahaniand97f5582011-03-23 19:50:54 +0000161 ICR_Complex_Real_Conversion,
162 ICR_Conversion,
John McCallf85e1932011-06-15 23:02:42 +0000163 ICR_Conversion,
164 ICR_Writeback_Conversion
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000165 };
166 return Rank[(int)Kind];
167}
168
169/// GetImplicitConversionName - Return the name of this kind of
170/// implicit conversion.
171const char* GetImplicitConversionName(ImplicitConversionKind Kind) {
Nuno Lopes2550d702009-12-23 17:49:57 +0000172 static const char* const Name[(int)ICK_Num_Conversion_Kinds] = {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000173 "No conversion",
174 "Lvalue-to-rvalue",
175 "Array-to-pointer",
176 "Function-to-pointer",
Douglas Gregor43c79c22009-12-09 00:47:37 +0000177 "Noreturn adjustment",
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000178 "Qualification",
179 "Integral promotion",
180 "Floating point promotion",
Douglas Gregor5cdf8212009-02-12 00:15:05 +0000181 "Complex promotion",
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000182 "Integral conversion",
183 "Floating conversion",
Douglas Gregor5cdf8212009-02-12 00:15:05 +0000184 "Complex conversion",
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000185 "Floating-integral conversion",
186 "Pointer conversion",
187 "Pointer-to-member conversion",
Douglas Gregor15da57e2008-10-29 02:00:59 +0000188 "Boolean conversion",
Douglas Gregorf9201e02009-02-11 23:02:49 +0000189 "Compatible-types conversion",
Douglas Gregorfb4a5432010-05-18 22:42:18 +0000190 "Derived-to-base conversion",
191 "Vector conversion",
192 "Vector splat",
Fariborz Jahaniand97f5582011-03-23 19:50:54 +0000193 "Complex-real conversion",
194 "Block Pointer conversion",
195 "Transparent Union Conversion"
John McCallf85e1932011-06-15 23:02:42 +0000196 "Writeback conversion"
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000197 };
198 return Name[Kind];
199}
200
Douglas Gregor60d62c22008-10-31 16:23:19 +0000201/// StandardConversionSequence - Set the standard conversion
202/// sequence to the identity conversion.
203void StandardConversionSequence::setAsIdentityConversion() {
204 First = ICK_Identity;
205 Second = ICK_Identity;
206 Third = ICK_Identity;
Douglas Gregora9bff302010-02-28 18:30:25 +0000207 DeprecatedStringLiteralToCharPtr = false;
John McCallf85e1932011-06-15 23:02:42 +0000208 QualificationIncludesObjCLifetime = false;
Douglas Gregor60d62c22008-10-31 16:23:19 +0000209 ReferenceBinding = false;
210 DirectBinding = false;
Douglas Gregor440a4832011-01-26 14:52:12 +0000211 IsLvalueReference = true;
212 BindsToFunctionLvalue = false;
213 BindsToRvalue = false;
Douglas Gregorfcab48b2011-01-26 19:41:18 +0000214 BindsImplicitObjectArgumentWithoutRefQualifier = false;
John McCallf85e1932011-06-15 23:02:42 +0000215 ObjCLifetimeConversionBinding = false;
Douglas Gregor225c41e2008-11-03 19:09:14 +0000216 CopyConstructor = 0;
Douglas Gregor60d62c22008-10-31 16:23:19 +0000217}
218
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000219/// getRank - Retrieve the rank of this standard conversion sequence
220/// (C++ 13.3.3.1.1p3). The rank is the largest rank of each of the
221/// implicit conversions.
222ImplicitConversionRank StandardConversionSequence::getRank() const {
223 ImplicitConversionRank Rank = ICR_Exact_Match;
224 if (GetConversionRank(First) > Rank)
225 Rank = GetConversionRank(First);
226 if (GetConversionRank(Second) > Rank)
227 Rank = GetConversionRank(Second);
228 if (GetConversionRank(Third) > Rank)
229 Rank = GetConversionRank(Third);
230 return Rank;
231}
232
233/// isPointerConversionToBool - Determines whether this conversion is
234/// a conversion of a pointer or pointer-to-member to bool. This is
Mike Stump1eb44332009-09-09 15:08:12 +0000235/// used as part of the ranking of standard conversion sequences
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000236/// (C++ 13.3.3.2p4).
Mike Stump1eb44332009-09-09 15:08:12 +0000237bool StandardConversionSequence::isPointerConversionToBool() const {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000238 // Note that FromType has not necessarily been transformed by the
239 // array-to-pointer or function-to-pointer implicit conversions, so
240 // check for their presence as well as checking whether FromType is
241 // a pointer.
Douglas Gregorad323a82010-01-27 03:51:04 +0000242 if (getToType(1)->isBooleanType() &&
John McCallddb0ce72010-06-11 10:04:22 +0000243 (getFromType()->isPointerType() ||
244 getFromType()->isObjCObjectPointerType() ||
245 getFromType()->isBlockPointerType() ||
Anders Carlssonc8df0b62010-11-05 00:12:09 +0000246 getFromType()->isNullPtrType() ||
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000247 First == ICK_Array_To_Pointer || First == ICK_Function_To_Pointer))
248 return true;
249
250 return false;
251}
252
Douglas Gregorbc0805a2008-10-23 00:40:37 +0000253/// isPointerConversionToVoidPointer - Determines whether this
254/// conversion is a conversion of a pointer to a void pointer. This is
255/// used as part of the ranking of standard conversion sequences (C++
256/// 13.3.3.2p4).
Mike Stump1eb44332009-09-09 15:08:12 +0000257bool
Douglas Gregorbc0805a2008-10-23 00:40:37 +0000258StandardConversionSequence::
Mike Stump1eb44332009-09-09 15:08:12 +0000259isPointerConversionToVoidPointer(ASTContext& Context) const {
John McCall1d318332010-01-12 00:44:57 +0000260 QualType FromType = getFromType();
Douglas Gregorad323a82010-01-27 03:51:04 +0000261 QualType ToType = getToType(1);
Douglas Gregorbc0805a2008-10-23 00:40:37 +0000262
263 // Note that FromType has not necessarily been transformed by the
264 // array-to-pointer implicit conversion, so check for its presence
265 // and redo the conversion to get a pointer.
266 if (First == ICK_Array_To_Pointer)
267 FromType = Context.getArrayDecayedType(FromType);
268
Douglas Gregorf9af5242011-04-15 20:45:44 +0000269 if (Second == ICK_Pointer_Conversion && FromType->isAnyPointerType())
Ted Kremenek6217b802009-07-29 21:53:49 +0000270 if (const PointerType* ToPtrType = ToType->getAs<PointerType>())
Douglas Gregorbc0805a2008-10-23 00:40:37 +0000271 return ToPtrType->getPointeeType()->isVoidType();
272
273 return false;
274}
275
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000276/// Skip any implicit casts which could be either part of a narrowing conversion
277/// or after one in an implicit conversion.
278static const Expr *IgnoreNarrowingConversion(const Expr *Converted) {
279 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
280 switch (ICE->getCastKind()) {
281 case CK_NoOp:
282 case CK_IntegralCast:
283 case CK_IntegralToBoolean:
284 case CK_IntegralToFloating:
285 case CK_FloatingToIntegral:
286 case CK_FloatingToBoolean:
287 case CK_FloatingCast:
288 Converted = ICE->getSubExpr();
289 continue;
290
291 default:
292 return Converted;
293 }
294 }
295
296 return Converted;
297}
298
299/// Check if this standard conversion sequence represents a narrowing
300/// conversion, according to C++11 [dcl.init.list]p7.
301///
302/// \param Ctx The AST context.
303/// \param Converted The result of applying this standard conversion sequence.
304/// \param ConstantValue If this is an NK_Constant_Narrowing conversion, the
305/// value of the expression prior to the narrowing conversion.
Richard Smithf6028062012-03-23 23:55:39 +0000306/// \param ConstantType If this is an NK_Constant_Narrowing conversion, the
307/// type of the expression prior to the narrowing conversion.
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000308NarrowingKind
Richard Smith8ef7b202012-01-18 23:55:52 +0000309StandardConversionSequence::getNarrowingKind(ASTContext &Ctx,
310 const Expr *Converted,
Richard Smithf6028062012-03-23 23:55:39 +0000311 APValue &ConstantValue,
312 QualType &ConstantType) const {
David Blaikie4e4d0842012-03-11 07:00:24 +0000313 assert(Ctx.getLangOpts().CPlusPlus && "narrowing check outside C++");
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000314
315 // C++11 [dcl.init.list]p7:
316 // A narrowing conversion is an implicit conversion ...
317 QualType FromType = getToType(0);
318 QualType ToType = getToType(1);
319 switch (Second) {
320 // -- from a floating-point type to an integer type, or
321 //
322 // -- from an integer type or unscoped enumeration type to a floating-point
323 // type, except where the source is a constant expression and the actual
324 // value after conversion will fit into the target type and will produce
325 // the original value when converted back to the original type, or
326 case ICK_Floating_Integral:
327 if (FromType->isRealFloatingType() && ToType->isIntegralType(Ctx)) {
328 return NK_Type_Narrowing;
329 } else if (FromType->isIntegralType(Ctx) && ToType->isRealFloatingType()) {
330 llvm::APSInt IntConstantValue;
331 const Expr *Initializer = IgnoreNarrowingConversion(Converted);
332 if (Initializer &&
333 Initializer->isIntegerConstantExpr(IntConstantValue, Ctx)) {
334 // Convert the integer to the floating type.
335 llvm::APFloat Result(Ctx.getFloatTypeSemantics(ToType));
336 Result.convertFromAPInt(IntConstantValue, IntConstantValue.isSigned(),
337 llvm::APFloat::rmNearestTiesToEven);
338 // And back.
339 llvm::APSInt ConvertedValue = IntConstantValue;
340 bool ignored;
341 Result.convertToInteger(ConvertedValue,
342 llvm::APFloat::rmTowardZero, &ignored);
343 // If the resulting value is different, this was a narrowing conversion.
344 if (IntConstantValue != ConvertedValue) {
345 ConstantValue = APValue(IntConstantValue);
Richard Smithf6028062012-03-23 23:55:39 +0000346 ConstantType = Initializer->getType();
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000347 return NK_Constant_Narrowing;
348 }
349 } else {
350 // Variables are always narrowings.
351 return NK_Variable_Narrowing;
352 }
353 }
354 return NK_Not_Narrowing;
355
356 // -- from long double to double or float, or from double to float, except
357 // where the source is a constant expression and the actual value after
358 // conversion is within the range of values that can be represented (even
359 // if it cannot be represented exactly), or
360 case ICK_Floating_Conversion:
361 if (FromType->isRealFloatingType() && ToType->isRealFloatingType() &&
362 Ctx.getFloatingTypeOrder(FromType, ToType) == 1) {
363 // FromType is larger than ToType.
364 const Expr *Initializer = IgnoreNarrowingConversion(Converted);
365 if (Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)) {
366 // Constant!
367 assert(ConstantValue.isFloat());
368 llvm::APFloat FloatVal = ConstantValue.getFloat();
369 // Convert the source value into the target type.
370 bool ignored;
371 llvm::APFloat::opStatus ConvertStatus = FloatVal.convert(
372 Ctx.getFloatTypeSemantics(ToType),
373 llvm::APFloat::rmNearestTiesToEven, &ignored);
374 // If there was no overflow, the source value is within the range of
375 // values that can be represented.
Richard Smithf6028062012-03-23 23:55:39 +0000376 if (ConvertStatus & llvm::APFloat::opOverflow) {
377 ConstantType = Initializer->getType();
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000378 return NK_Constant_Narrowing;
Richard Smithf6028062012-03-23 23:55:39 +0000379 }
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000380 } else {
381 return NK_Variable_Narrowing;
382 }
383 }
384 return NK_Not_Narrowing;
385
386 // -- from an integer type or unscoped enumeration type to an integer type
387 // that cannot represent all the values of the original type, except where
388 // the source is a constant expression and the actual value after
389 // conversion will fit into the target type and will produce the original
390 // value when converted back to the original type.
391 case ICK_Boolean_Conversion: // Bools are integers too.
392 if (!FromType->isIntegralOrUnscopedEnumerationType()) {
393 // Boolean conversions can be from pointers and pointers to members
394 // [conv.bool], and those aren't considered narrowing conversions.
395 return NK_Not_Narrowing;
396 } // Otherwise, fall through to the integral case.
397 case ICK_Integral_Conversion: {
398 assert(FromType->isIntegralOrUnscopedEnumerationType());
399 assert(ToType->isIntegralOrUnscopedEnumerationType());
400 const bool FromSigned = FromType->isSignedIntegerOrEnumerationType();
401 const unsigned FromWidth = Ctx.getIntWidth(FromType);
402 const bool ToSigned = ToType->isSignedIntegerOrEnumerationType();
403 const unsigned ToWidth = Ctx.getIntWidth(ToType);
404
405 if (FromWidth > ToWidth ||
Richard Smithcd65f492012-06-13 01:07:41 +0000406 (FromWidth == ToWidth && FromSigned != ToSigned) ||
407 (FromSigned && !ToSigned)) {
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000408 // Not all values of FromType can be represented in ToType.
409 llvm::APSInt InitializerValue;
410 const Expr *Initializer = IgnoreNarrowingConversion(Converted);
Richard Smithcd65f492012-06-13 01:07:41 +0000411 if (!Initializer->isIntegerConstantExpr(InitializerValue, Ctx)) {
412 // Such conversions on variables are always narrowing.
413 return NK_Variable_Narrowing;
Richard Smith5d7700e2012-06-19 21:28:35 +0000414 }
415 bool Narrowing = false;
416 if (FromWidth < ToWidth) {
Richard Smithcd65f492012-06-13 01:07:41 +0000417 // Negative -> unsigned is narrowing. Otherwise, more bits is never
418 // narrowing.
419 if (InitializerValue.isSigned() && InitializerValue.isNegative())
Richard Smith5d7700e2012-06-19 21:28:35 +0000420 Narrowing = true;
Richard Smithcd65f492012-06-13 01:07:41 +0000421 } else {
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000422 // Add a bit to the InitializerValue so we don't have to worry about
423 // signed vs. unsigned comparisons.
424 InitializerValue = InitializerValue.extend(
425 InitializerValue.getBitWidth() + 1);
426 // Convert the initializer to and from the target width and signed-ness.
427 llvm::APSInt ConvertedValue = InitializerValue;
428 ConvertedValue = ConvertedValue.trunc(ToWidth);
429 ConvertedValue.setIsSigned(ToSigned);
430 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
431 ConvertedValue.setIsSigned(InitializerValue.isSigned());
432 // If the result is different, this was a narrowing conversion.
Richard Smith5d7700e2012-06-19 21:28:35 +0000433 if (ConvertedValue != InitializerValue)
434 Narrowing = true;
435 }
436 if (Narrowing) {
437 ConstantType = Initializer->getType();
438 ConstantValue = APValue(InitializerValue);
439 return NK_Constant_Narrowing;
Richard Smith4c3fc9b2012-01-18 05:21:49 +0000440 }
441 }
442 return NK_Not_Narrowing;
443 }
444
445 default:
446 // Other kinds of conversions are not narrowings.
447 return NK_Not_Narrowing;
448 }
449}
450
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000451/// DebugPrint - Print this standard conversion sequence to standard
452/// error. Useful for debugging overloading issues.
453void StandardConversionSequence::DebugPrint() const {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000454 raw_ostream &OS = llvm::errs();
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000455 bool PrintedSomething = false;
456 if (First != ICK_Identity) {
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000457 OS << GetImplicitConversionName(First);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000458 PrintedSomething = true;
459 }
460
461 if (Second != ICK_Identity) {
462 if (PrintedSomething) {
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000463 OS << " -> ";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000464 }
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000465 OS << GetImplicitConversionName(Second);
Douglas Gregor225c41e2008-11-03 19:09:14 +0000466
467 if (CopyConstructor) {
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000468 OS << " (by copy constructor)";
Douglas Gregor225c41e2008-11-03 19:09:14 +0000469 } else if (DirectBinding) {
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000470 OS << " (direct reference binding)";
Douglas Gregor225c41e2008-11-03 19:09:14 +0000471 } else if (ReferenceBinding) {
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000472 OS << " (reference binding)";
Douglas Gregor225c41e2008-11-03 19:09:14 +0000473 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000474 PrintedSomething = true;
475 }
476
477 if (Third != ICK_Identity) {
478 if (PrintedSomething) {
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000479 OS << " -> ";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000480 }
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000481 OS << GetImplicitConversionName(Third);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000482 PrintedSomething = true;
483 }
484
485 if (!PrintedSomething) {
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000486 OS << "No conversions required";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000487 }
488}
489
490/// DebugPrint - Print this user-defined conversion sequence to standard
491/// error. Useful for debugging overloading issues.
492void UserDefinedConversionSequence::DebugPrint() const {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000493 raw_ostream &OS = llvm::errs();
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000494 if (Before.First || Before.Second || Before.Third) {
495 Before.DebugPrint();
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000496 OS << " -> ";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000497 }
Sebastian Redlcc7a6482011-11-01 15:53:09 +0000498 if (ConversionFunction)
499 OS << '\'' << *ConversionFunction << '\'';
500 else
501 OS << "aggregate initialization";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000502 if (After.First || After.Second || After.Third) {
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000503 OS << " -> ";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000504 After.DebugPrint();
505 }
506}
507
508/// DebugPrint - Print this implicit conversion sequence to standard
509/// error. Useful for debugging overloading issues.
510void ImplicitConversionSequence::DebugPrint() const {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000511 raw_ostream &OS = llvm::errs();
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000512 switch (ConversionKind) {
513 case StandardConversion:
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000514 OS << "Standard conversion: ";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000515 Standard.DebugPrint();
516 break;
517 case UserDefinedConversion:
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000518 OS << "User-defined conversion: ";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000519 UserDefined.DebugPrint();
520 break;
521 case EllipsisConversion:
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000522 OS << "Ellipsis conversion";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000523 break;
John McCall1d318332010-01-12 00:44:57 +0000524 case AmbiguousConversion:
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000525 OS << "Ambiguous conversion";
John McCall1d318332010-01-12 00:44:57 +0000526 break;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000527 case BadConversion:
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000528 OS << "Bad conversion";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000529 break;
530 }
531
Daniel Dunbarf3f91f32010-01-22 02:04:41 +0000532 OS << "\n";
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000533}
534
John McCall1d318332010-01-12 00:44:57 +0000535void AmbiguousConversionSequence::construct() {
536 new (&conversions()) ConversionSet();
537}
538
539void AmbiguousConversionSequence::destruct() {
540 conversions().~ConversionSet();
541}
542
543void
544AmbiguousConversionSequence::copyFrom(const AmbiguousConversionSequence &O) {
545 FromTypePtr = O.FromTypePtr;
546 ToTypePtr = O.ToTypePtr;
547 new (&conversions()) ConversionSet(O.conversions());
548}
549
Douglas Gregora9333192010-05-08 17:41:32 +0000550namespace {
551 // Structure used by OverloadCandidate::DeductionFailureInfo to store
Richard Smith29805ca2013-01-31 05:19:49 +0000552 // template argument information.
553 struct DFIArguments {
Douglas Gregora9333192010-05-08 17:41:32 +0000554 TemplateArgument FirstArg;
555 TemplateArgument SecondArg;
556 };
Richard Smith29805ca2013-01-31 05:19:49 +0000557 // Structure used by OverloadCandidate::DeductionFailureInfo to store
558 // template parameter and template argument information.
559 struct DFIParamWithArguments : DFIArguments {
560 TemplateParameter Param;
561 };
Douglas Gregora9333192010-05-08 17:41:32 +0000562}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000563
Douglas Gregora9333192010-05-08 17:41:32 +0000564/// \brief Convert from Sema's representation of template deduction information
565/// to the form used in overload-candidate information.
566OverloadCandidate::DeductionFailureInfo
Douglas Gregorff5adac2010-05-08 20:18:54 +0000567static MakeDeductionFailureInfo(ASTContext &Context,
568 Sema::TemplateDeductionResult TDK,
John McCall2a7fb272010-08-25 05:32:35 +0000569 TemplateDeductionInfo &Info) {
Douglas Gregora9333192010-05-08 17:41:32 +0000570 OverloadCandidate::DeductionFailureInfo Result;
571 Result.Result = static_cast<unsigned>(TDK);
Richard Smithb8590f32012-05-07 09:03:25 +0000572 Result.HasDiagnostic = false;
Douglas Gregora9333192010-05-08 17:41:32 +0000573 Result.Data = 0;
574 switch (TDK) {
575 case Sema::TDK_Success:
Douglas Gregorae19fbb2012-09-13 21:01:57 +0000576 case Sema::TDK_Invalid:
Douglas Gregora9333192010-05-08 17:41:32 +0000577 case Sema::TDK_InstantiationDepth:
Douglas Gregor0ca4c582010-05-08 18:20:53 +0000578 case Sema::TDK_TooManyArguments:
579 case Sema::TDK_TooFewArguments:
Douglas Gregora9333192010-05-08 17:41:32 +0000580 break;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000581
Douglas Gregora9333192010-05-08 17:41:32 +0000582 case Sema::TDK_Incomplete:
Douglas Gregorf1a84452010-05-08 19:15:54 +0000583 case Sema::TDK_InvalidExplicitArguments:
Douglas Gregora9333192010-05-08 17:41:32 +0000584 Result.Data = Info.Param.getOpaqueValue();
585 break;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000586
Richard Smith29805ca2013-01-31 05:19:49 +0000587 case Sema::TDK_NonDeducedMismatch: {
588 // FIXME: Should allocate from normal heap so that we can free this later.
589 DFIArguments *Saved = new (Context) DFIArguments;
590 Saved->FirstArg = Info.FirstArg;
591 Saved->SecondArg = Info.SecondArg;
592 Result.Data = Saved;
593 break;
594 }
595
Douglas Gregora9333192010-05-08 17:41:32 +0000596 case Sema::TDK_Inconsistent:
John McCall57e97782010-08-05 09:05:08 +0000597 case Sema::TDK_Underqualified: {
Douglas Gregorff5adac2010-05-08 20:18:54 +0000598 // FIXME: Should allocate from normal heap so that we can free this later.
599 DFIParamWithArguments *Saved = new (Context) DFIParamWithArguments;
Douglas Gregora9333192010-05-08 17:41:32 +0000600 Saved->Param = Info.Param;
601 Saved->FirstArg = Info.FirstArg;
602 Saved->SecondArg = Info.SecondArg;
603 Result.Data = Saved;
604 break;
605 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000606
Douglas Gregora9333192010-05-08 17:41:32 +0000607 case Sema::TDK_SubstitutionFailure:
Douglas Gregorec20f462010-05-08 20:07:26 +0000608 Result.Data = Info.take();
Richard Smithb8590f32012-05-07 09:03:25 +0000609 if (Info.hasSFINAEDiagnostic()) {
610 PartialDiagnosticAt *Diag = new (Result.Diagnostic) PartialDiagnosticAt(
611 SourceLocation(), PartialDiagnostic::NullDiagnostic());
612 Info.takeSFINAEDiagnostic(*Diag);
613 Result.HasDiagnostic = true;
614 }
Douglas Gregorec20f462010-05-08 20:07:26 +0000615 break;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000616
Douglas Gregora9333192010-05-08 17:41:32 +0000617 case Sema::TDK_FailedOverloadResolution:
Richard Smith0efa62f2013-01-31 04:03:12 +0000618 Result.Data = Info.Expression;
619 break;
620
Richard Smith29805ca2013-01-31 05:19:49 +0000621 case Sema::TDK_MiscellaneousDeductionFailure:
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000622 break;
Douglas Gregora9333192010-05-08 17:41:32 +0000623 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000624
Douglas Gregora9333192010-05-08 17:41:32 +0000625 return Result;
626}
John McCall1d318332010-01-12 00:44:57 +0000627
Douglas Gregora9333192010-05-08 17:41:32 +0000628void OverloadCandidate::DeductionFailureInfo::Destroy() {
629 switch (static_cast<Sema::TemplateDeductionResult>(Result)) {
630 case Sema::TDK_Success:
Douglas Gregorae19fbb2012-09-13 21:01:57 +0000631 case Sema::TDK_Invalid:
Douglas Gregora9333192010-05-08 17:41:32 +0000632 case Sema::TDK_InstantiationDepth:
633 case Sema::TDK_Incomplete:
Douglas Gregor0ca4c582010-05-08 18:20:53 +0000634 case Sema::TDK_TooManyArguments:
635 case Sema::TDK_TooFewArguments:
Douglas Gregorf1a84452010-05-08 19:15:54 +0000636 case Sema::TDK_InvalidExplicitArguments:
Richard Smith29805ca2013-01-31 05:19:49 +0000637 case Sema::TDK_FailedOverloadResolution:
Douglas Gregora9333192010-05-08 17:41:32 +0000638 break;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000639
Douglas Gregora9333192010-05-08 17:41:32 +0000640 case Sema::TDK_Inconsistent:
John McCall57e97782010-08-05 09:05:08 +0000641 case Sema::TDK_Underqualified:
Richard Smith29805ca2013-01-31 05:19:49 +0000642 case Sema::TDK_NonDeducedMismatch:
Douglas Gregoraaa045d2010-05-08 20:20:05 +0000643 // FIXME: Destroy the data?
Douglas Gregora9333192010-05-08 17:41:32 +0000644 Data = 0;
645 break;
Douglas Gregorec20f462010-05-08 20:07:26 +0000646
647 case Sema::TDK_SubstitutionFailure:
Richard Smithb8590f32012-05-07 09:03:25 +0000648 // FIXME: Destroy the template argument list?
Douglas Gregorec20f462010-05-08 20:07:26 +0000649 Data = 0;
Richard Smithb8590f32012-05-07 09:03:25 +0000650 if (PartialDiagnosticAt *Diag = getSFINAEDiagnostic()) {
651 Diag->~PartialDiagnosticAt();
652 HasDiagnostic = false;
653 }
Douglas Gregorec20f462010-05-08 20:07:26 +0000654 break;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000655
Douglas Gregor0ca4c582010-05-08 18:20:53 +0000656 // Unhandled
Richard Smith29805ca2013-01-31 05:19:49 +0000657 case Sema::TDK_MiscellaneousDeductionFailure:
Douglas Gregora9333192010-05-08 17:41:32 +0000658 break;
659 }
660}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000661
Richard Smithb8590f32012-05-07 09:03:25 +0000662PartialDiagnosticAt *
663OverloadCandidate::DeductionFailureInfo::getSFINAEDiagnostic() {
664 if (HasDiagnostic)
665 return static_cast<PartialDiagnosticAt*>(static_cast<void*>(Diagnostic));
666 return 0;
667}
668
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000669TemplateParameter
Douglas Gregora9333192010-05-08 17:41:32 +0000670OverloadCandidate::DeductionFailureInfo::getTemplateParameter() {
671 switch (static_cast<Sema::TemplateDeductionResult>(Result)) {
672 case Sema::TDK_Success:
Douglas Gregorae19fbb2012-09-13 21:01:57 +0000673 case Sema::TDK_Invalid:
Douglas Gregora9333192010-05-08 17:41:32 +0000674 case Sema::TDK_InstantiationDepth:
Douglas Gregor0ca4c582010-05-08 18:20:53 +0000675 case Sema::TDK_TooManyArguments:
676 case Sema::TDK_TooFewArguments:
Douglas Gregorec20f462010-05-08 20:07:26 +0000677 case Sema::TDK_SubstitutionFailure:
Richard Smith29805ca2013-01-31 05:19:49 +0000678 case Sema::TDK_NonDeducedMismatch:
679 case Sema::TDK_FailedOverloadResolution:
Douglas Gregora9333192010-05-08 17:41:32 +0000680 return TemplateParameter();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000681
Douglas Gregora9333192010-05-08 17:41:32 +0000682 case Sema::TDK_Incomplete:
Douglas Gregorf1a84452010-05-08 19:15:54 +0000683 case Sema::TDK_InvalidExplicitArguments:
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000684 return TemplateParameter::getFromOpaqueValue(Data);
Douglas Gregora9333192010-05-08 17:41:32 +0000685
686 case Sema::TDK_Inconsistent:
John McCall57e97782010-08-05 09:05:08 +0000687 case Sema::TDK_Underqualified:
Douglas Gregora9333192010-05-08 17:41:32 +0000688 return static_cast<DFIParamWithArguments*>(Data)->Param;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000689
Douglas Gregora9333192010-05-08 17:41:32 +0000690 // Unhandled
Richard Smith29805ca2013-01-31 05:19:49 +0000691 case Sema::TDK_MiscellaneousDeductionFailure:
Douglas Gregora9333192010-05-08 17:41:32 +0000692 break;
693 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000694
Douglas Gregora9333192010-05-08 17:41:32 +0000695 return TemplateParameter();
696}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000697
Douglas Gregorec20f462010-05-08 20:07:26 +0000698TemplateArgumentList *
699OverloadCandidate::DeductionFailureInfo::getTemplateArgumentList() {
700 switch (static_cast<Sema::TemplateDeductionResult>(Result)) {
Richard Smith29805ca2013-01-31 05:19:49 +0000701 case Sema::TDK_Success:
702 case Sema::TDK_Invalid:
703 case Sema::TDK_InstantiationDepth:
704 case Sema::TDK_TooManyArguments:
705 case Sema::TDK_TooFewArguments:
706 case Sema::TDK_Incomplete:
707 case Sema::TDK_InvalidExplicitArguments:
708 case Sema::TDK_Inconsistent:
709 case Sema::TDK_Underqualified:
710 case Sema::TDK_NonDeducedMismatch:
711 case Sema::TDK_FailedOverloadResolution:
712 return 0;
Douglas Gregorec20f462010-05-08 20:07:26 +0000713
Richard Smith29805ca2013-01-31 05:19:49 +0000714 case Sema::TDK_SubstitutionFailure:
715 return static_cast<TemplateArgumentList*>(Data);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000716
Richard Smith29805ca2013-01-31 05:19:49 +0000717 // Unhandled
718 case Sema::TDK_MiscellaneousDeductionFailure:
719 break;
Douglas Gregorec20f462010-05-08 20:07:26 +0000720 }
721
722 return 0;
723}
724
Douglas Gregora9333192010-05-08 17:41:32 +0000725const TemplateArgument *OverloadCandidate::DeductionFailureInfo::getFirstArg() {
726 switch (static_cast<Sema::TemplateDeductionResult>(Result)) {
727 case Sema::TDK_Success:
Douglas Gregorae19fbb2012-09-13 21:01:57 +0000728 case Sema::TDK_Invalid:
Douglas Gregora9333192010-05-08 17:41:32 +0000729 case Sema::TDK_InstantiationDepth:
730 case Sema::TDK_Incomplete:
Douglas Gregor0ca4c582010-05-08 18:20:53 +0000731 case Sema::TDK_TooManyArguments:
732 case Sema::TDK_TooFewArguments:
Douglas Gregorf1a84452010-05-08 19:15:54 +0000733 case Sema::TDK_InvalidExplicitArguments:
Douglas Gregorec20f462010-05-08 20:07:26 +0000734 case Sema::TDK_SubstitutionFailure:
Richard Smith29805ca2013-01-31 05:19:49 +0000735 case Sema::TDK_FailedOverloadResolution:
Douglas Gregora9333192010-05-08 17:41:32 +0000736 return 0;
737
Douglas Gregora9333192010-05-08 17:41:32 +0000738 case Sema::TDK_Inconsistent:
John McCall57e97782010-08-05 09:05:08 +0000739 case Sema::TDK_Underqualified:
Richard Smith29805ca2013-01-31 05:19:49 +0000740 case Sema::TDK_NonDeducedMismatch:
741 return &static_cast<DFIArguments*>(Data)->FirstArg;
Douglas Gregora9333192010-05-08 17:41:32 +0000742
Douglas Gregor0ca4c582010-05-08 18:20:53 +0000743 // Unhandled
Richard Smith29805ca2013-01-31 05:19:49 +0000744 case Sema::TDK_MiscellaneousDeductionFailure:
Douglas Gregora9333192010-05-08 17:41:32 +0000745 break;
746 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000747
Douglas Gregora9333192010-05-08 17:41:32 +0000748 return 0;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000749}
Douglas Gregora9333192010-05-08 17:41:32 +0000750
751const TemplateArgument *
752OverloadCandidate::DeductionFailureInfo::getSecondArg() {
753 switch (static_cast<Sema::TemplateDeductionResult>(Result)) {
754 case Sema::TDK_Success:
Douglas Gregorae19fbb2012-09-13 21:01:57 +0000755 case Sema::TDK_Invalid:
Douglas Gregora9333192010-05-08 17:41:32 +0000756 case Sema::TDK_InstantiationDepth:
757 case Sema::TDK_Incomplete:
Douglas Gregor0ca4c582010-05-08 18:20:53 +0000758 case Sema::TDK_TooManyArguments:
759 case Sema::TDK_TooFewArguments:
Douglas Gregorf1a84452010-05-08 19:15:54 +0000760 case Sema::TDK_InvalidExplicitArguments:
Douglas Gregorec20f462010-05-08 20:07:26 +0000761 case Sema::TDK_SubstitutionFailure:
Richard Smith29805ca2013-01-31 05:19:49 +0000762 case Sema::TDK_FailedOverloadResolution:
Douglas Gregora9333192010-05-08 17:41:32 +0000763 return 0;
764
Douglas Gregora9333192010-05-08 17:41:32 +0000765 case Sema::TDK_Inconsistent:
John McCall57e97782010-08-05 09:05:08 +0000766 case Sema::TDK_Underqualified:
Richard Smith29805ca2013-01-31 05:19:49 +0000767 case Sema::TDK_NonDeducedMismatch:
768 return &static_cast<DFIArguments*>(Data)->SecondArg;
Douglas Gregora9333192010-05-08 17:41:32 +0000769
Douglas Gregor0ca4c582010-05-08 18:20:53 +0000770 // Unhandled
Richard Smith29805ca2013-01-31 05:19:49 +0000771 case Sema::TDK_MiscellaneousDeductionFailure:
Douglas Gregora9333192010-05-08 17:41:32 +0000772 break;
773 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000774
Douglas Gregora9333192010-05-08 17:41:32 +0000775 return 0;
776}
777
Richard Smith0efa62f2013-01-31 04:03:12 +0000778Expr *
779OverloadCandidate::DeductionFailureInfo::getExpr() {
780 if (static_cast<Sema::TemplateDeductionResult>(Result) ==
781 Sema::TDK_FailedOverloadResolution)
782 return static_cast<Expr*>(Data);
783
784 return 0;
785}
786
Benjamin Kramerf5b132f2012-10-09 15:52:25 +0000787void OverloadCandidateSet::destroyCandidates() {
Richard Smithe3898ac2012-07-18 23:52:59 +0000788 for (iterator i = begin(), e = end(); i != e; ++i) {
Benjamin Kramer9e2822b2012-01-14 20:16:52 +0000789 for (unsigned ii = 0, ie = i->NumConversions; ii != ie; ++ii)
790 i->Conversions[ii].~ImplicitConversionSequence();
Richard Smithe3898ac2012-07-18 23:52:59 +0000791 if (!i->Viable && i->FailureKind == ovl_fail_bad_deduction)
792 i->DeductionFailure.Destroy();
793 }
Benjamin Kramerf5b132f2012-10-09 15:52:25 +0000794}
795
796void OverloadCandidateSet::clear() {
797 destroyCandidates();
Benjamin Kramer314f5542012-01-14 19:31:39 +0000798 NumInlineSequences = 0;
Benjamin Kramer0e6a16f2012-01-14 16:31:55 +0000799 Candidates.clear();
Douglas Gregora9333192010-05-08 17:41:32 +0000800 Functions.clear();
801}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +0000802
John McCall5acb0c92011-10-17 18:40:02 +0000803namespace {
804 class UnbridgedCastsSet {
805 struct Entry {
806 Expr **Addr;
807 Expr *Saved;
808 };
809 SmallVector<Entry, 2> Entries;
810
811 public:
812 void save(Sema &S, Expr *&E) {
813 assert(E->hasPlaceholderType(BuiltinType::ARCUnbridgedCast));
814 Entry entry = { &E, E };
815 Entries.push_back(entry);
816 E = S.stripARCUnbridgedCast(E);
817 }
818
819 void restore() {
820 for (SmallVectorImpl<Entry>::iterator
821 i = Entries.begin(), e = Entries.end(); i != e; ++i)
822 *i->Addr = i->Saved;
823 }
824 };
825}
826
827/// checkPlaceholderForOverload - Do any interesting placeholder-like
828/// preprocessing on the given expression.
829///
830/// \param unbridgedCasts a collection to which to add unbridged casts;
831/// without this, they will be immediately diagnosed as errors
832///
833/// Return true on unrecoverable error.
834static bool checkPlaceholderForOverload(Sema &S, Expr *&E,
835 UnbridgedCastsSet *unbridgedCasts = 0) {
John McCall5acb0c92011-10-17 18:40:02 +0000836 if (const BuiltinType *placeholder = E->getType()->getAsPlaceholderType()) {
837 // We can't handle overloaded expressions here because overload
838 // resolution might reasonably tweak them.
839 if (placeholder->getKind() == BuiltinType::Overload) return false;
840
841 // If the context potentially accepts unbridged ARC casts, strip
842 // the unbridged cast and add it to the collection for later restoration.
843 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
844 unbridgedCasts) {
845 unbridgedCasts->save(S, E);
846 return false;
847 }
848
849 // Go ahead and check everything else.
850 ExprResult result = S.CheckPlaceholderExpr(E);
851 if (result.isInvalid())
852 return true;
853
854 E = result.take();
855 return false;
856 }
857
858 // Nothing to do.
859 return false;
860}
861
862/// checkArgPlaceholdersForOverload - Check a set of call operands for
863/// placeholders.
Dmitri Gribenko9e00f122013-05-09 21:02:07 +0000864static bool checkArgPlaceholdersForOverload(Sema &S,
865 MultiExprArg Args,
John McCall5acb0c92011-10-17 18:40:02 +0000866 UnbridgedCastsSet &unbridged) {
Dmitri Gribenko9e00f122013-05-09 21:02:07 +0000867 for (unsigned i = 0, e = Args.size(); i != e; ++i)
868 if (checkPlaceholderForOverload(S, Args[i], &unbridged))
John McCall5acb0c92011-10-17 18:40:02 +0000869 return true;
870
871 return false;
872}
873
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000874// IsOverload - Determine whether the given New declaration is an
John McCall51fa86f2009-12-02 08:47:38 +0000875// overload of the declarations in Old. This routine returns false if
876// New and Old cannot be overloaded, e.g., if New has the same
877// signature as some function in Old (C++ 1.3.10) or if the Old
878// declarations aren't functions (or function templates) at all. When
John McCall871b2e72009-12-09 03:35:25 +0000879// it does return false, MatchedDecl will point to the decl that New
880// cannot be overloaded with. This decl may be a UsingShadowDecl on
881// top of the underlying declaration.
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000882//
883// Example: Given the following input:
884//
885// void f(int, float); // #1
886// void f(int, int); // #2
887// int f(int, int); // #3
888//
889// When we process #1, there is no previous declaration of "f",
Mike Stump1eb44332009-09-09 15:08:12 +0000890// so IsOverload will not be used.
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000891//
John McCall51fa86f2009-12-02 08:47:38 +0000892// When we process #2, Old contains only the FunctionDecl for #1. By
893// comparing the parameter types, we see that #1 and #2 are overloaded
894// (since they have different signatures), so this routine returns
895// false; MatchedDecl is unchanged.
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000896//
John McCall51fa86f2009-12-02 08:47:38 +0000897// When we process #3, Old is an overload set containing #1 and #2. We
898// compare the signatures of #3 to #1 (they're overloaded, so we do
899// nothing) and then #3 to #2. Since the signatures of #3 and #2 are
900// identical (return types of functions are not part of the
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000901// signature), IsOverload returns false and MatchedDecl will be set to
902// point to the FunctionDecl for #2.
John McCallad00b772010-06-16 08:42:20 +0000903//
904// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced
905// into a class by a using declaration. The rules for whether to hide
906// shadow declarations ignore some properties which otherwise figure
907// into a function template's signature.
John McCall871b2e72009-12-09 03:35:25 +0000908Sema::OverloadKind
John McCallad00b772010-06-16 08:42:20 +0000909Sema::CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &Old,
910 NamedDecl *&Match, bool NewIsUsingDecl) {
John McCall51fa86f2009-12-02 08:47:38 +0000911 for (LookupResult::iterator I = Old.begin(), E = Old.end();
John McCall68263142009-11-18 22:49:29 +0000912 I != E; ++I) {
John McCallad00b772010-06-16 08:42:20 +0000913 NamedDecl *OldD = *I;
914
915 bool OldIsUsingDecl = false;
916 if (isa<UsingShadowDecl>(OldD)) {
917 OldIsUsingDecl = true;
918
919 // We can always introduce two using declarations into the same
920 // context, even if they have identical signatures.
921 if (NewIsUsingDecl) continue;
922
923 OldD = cast<UsingShadowDecl>(OldD)->getTargetDecl();
924 }
925
926 // If either declaration was introduced by a using declaration,
927 // we'll need to use slightly different rules for matching.
928 // Essentially, these rules are the normal rules, except that
929 // function templates hide function templates with different
930 // return types or template parameter lists.
931 bool UseMemberUsingDeclRules =
John McCall78037ac2013-04-03 21:19:47 +0000932 (OldIsUsingDecl || NewIsUsingDecl) && CurContext->isRecord() &&
933 !New->getFriendObjectKind();
John McCallad00b772010-06-16 08:42:20 +0000934
John McCall51fa86f2009-12-02 08:47:38 +0000935 if (FunctionTemplateDecl *OldT = dyn_cast<FunctionTemplateDecl>(OldD)) {
John McCallad00b772010-06-16 08:42:20 +0000936 if (!IsOverload(New, OldT->getTemplatedDecl(), UseMemberUsingDeclRules)) {
937 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
938 HideUsingShadowDecl(S, cast<UsingShadowDecl>(*I));
939 continue;
940 }
941
John McCall871b2e72009-12-09 03:35:25 +0000942 Match = *I;
943 return Ovl_Match;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000944 }
John McCall51fa86f2009-12-02 08:47:38 +0000945 } else if (FunctionDecl *OldF = dyn_cast<FunctionDecl>(OldD)) {
John McCallad00b772010-06-16 08:42:20 +0000946 if (!IsOverload(New, OldF, UseMemberUsingDeclRules)) {
947 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
948 HideUsingShadowDecl(S, cast<UsingShadowDecl>(*I));
949 continue;
950 }
951
Rafael Espindola90cc3902013-04-15 12:49:13 +0000952 if (!shouldLinkPossiblyHiddenDecl(*I, New))
953 continue;
954
John McCall871b2e72009-12-09 03:35:25 +0000955 Match = *I;
956 return Ovl_Match;
John McCall68263142009-11-18 22:49:29 +0000957 }
John McCalld7945c62010-11-10 03:01:53 +0000958 } else if (isa<UsingDecl>(OldD)) {
John McCall9f54ad42009-12-10 09:41:52 +0000959 // We can overload with these, which can show up when doing
960 // redeclaration checks for UsingDecls.
961 assert(Old.getLookupKind() == LookupUsingDeclName);
John McCalld7945c62010-11-10 03:01:53 +0000962 } else if (isa<TagDecl>(OldD)) {
963 // We can always overload with tags by hiding them.
John McCall9f54ad42009-12-10 09:41:52 +0000964 } else if (isa<UnresolvedUsingValueDecl>(OldD)) {
965 // Optimistically assume that an unresolved using decl will
966 // overload; if it doesn't, we'll have to diagnose during
967 // template instantiation.
968 } else {
John McCall68263142009-11-18 22:49:29 +0000969 // (C++ 13p1):
970 // Only function declarations can be overloaded; object and type
971 // declarations cannot be overloaded.
John McCall871b2e72009-12-09 03:35:25 +0000972 Match = *I;
973 return Ovl_NonFunction;
John McCall68263142009-11-18 22:49:29 +0000974 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000975 }
John McCall68263142009-11-18 22:49:29 +0000976
John McCall871b2e72009-12-09 03:35:25 +0000977 return Ovl_Overload;
John McCall68263142009-11-18 22:49:29 +0000978}
979
Rafael Espindola78eeba82012-12-28 14:21:58 +0000980static bool canBeOverloaded(const FunctionDecl &D) {
981 if (D.getAttr<OverloadableAttr>())
982 return true;
Rafael Espindolad2fdd422013-02-14 01:47:04 +0000983 if (D.isExternC())
Rafael Espindola78eeba82012-12-28 14:21:58 +0000984 return false;
Rafael Espindola7a525ac2013-01-12 01:47:40 +0000985
986 // Main cannot be overloaded (basic.start.main).
987 if (D.isMain())
988 return false;
989
Rafael Espindola78eeba82012-12-28 14:21:58 +0000990 return true;
991}
992
Rafael Espindola2d1b0962013-03-14 03:07:35 +0000993static bool shouldTryToOverload(Sema &S, FunctionDecl *New, FunctionDecl *Old,
994 bool UseUsingDeclRules) {
John McCall68263142009-11-18 22:49:29 +0000995 FunctionTemplateDecl *OldTemplate = Old->getDescribedFunctionTemplate();
996 FunctionTemplateDecl *NewTemplate = New->getDescribedFunctionTemplate();
997
998 // C++ [temp.fct]p2:
999 // A function template can be overloaded with other function templates
1000 // and with normal (non-template) functions.
1001 if ((OldTemplate == 0) != (NewTemplate == 0))
1002 return true;
1003
1004 // Is the function New an overload of the function Old?
Rafael Espindola2d1b0962013-03-14 03:07:35 +00001005 QualType OldQType = S.Context.getCanonicalType(Old->getType());
1006 QualType NewQType = S.Context.getCanonicalType(New->getType());
John McCall68263142009-11-18 22:49:29 +00001007
1008 // Compare the signatures (C++ 1.3.10) of the two functions to
1009 // determine whether they are overloads. If we find any mismatch
1010 // in the signature, they are overloads.
1011
1012 // If either of these functions is a K&R-style function (no
1013 // prototype), then we consider them to have matching signatures.
1014 if (isa<FunctionNoProtoType>(OldQType.getTypePtr()) ||
1015 isa<FunctionNoProtoType>(NewQType.getTypePtr()))
1016 return false;
1017
John McCallf4c73712011-01-19 06:33:43 +00001018 const FunctionProtoType* OldType = cast<FunctionProtoType>(OldQType);
1019 const FunctionProtoType* NewType = cast<FunctionProtoType>(NewQType);
John McCall68263142009-11-18 22:49:29 +00001020
1021 // The signature of a function includes the types of its
1022 // parameters (C++ 1.3.10), which includes the presence or absence
1023 // of the ellipsis; see C++ DR 357).
1024 if (OldQType != NewQType &&
1025 (OldType->getNumArgs() != NewType->getNumArgs() ||
1026 OldType->isVariadic() != NewType->isVariadic() ||
Rafael Espindola2d1b0962013-03-14 03:07:35 +00001027 !S.FunctionArgTypesAreEqual(OldType, NewType)))
John McCall68263142009-11-18 22:49:29 +00001028 return true;
1029
1030 // C++ [temp.over.link]p4:
1031 // The signature of a function template consists of its function
1032 // signature, its return type and its template parameter list. The names
1033 // of the template parameters are significant only for establishing the
1034 // relationship between the template parameters and the rest of the
1035 // signature.
1036 //
1037 // We check the return type and template parameter lists for function
1038 // templates first; the remaining checks follow.
John McCallad00b772010-06-16 08:42:20 +00001039 //
1040 // However, we don't consider either of these when deciding whether
1041 // a member introduced by a shadow declaration is hidden.
1042 if (!UseUsingDeclRules && NewTemplate &&
Rafael Espindola2d1b0962013-03-14 03:07:35 +00001043 (!S.TemplateParameterListsAreEqual(NewTemplate->getTemplateParameters(),
1044 OldTemplate->getTemplateParameters(),
1045 false, S.TPL_TemplateMatch) ||
John McCall68263142009-11-18 22:49:29 +00001046 OldType->getResultType() != NewType->getResultType()))
1047 return true;
1048
1049 // If the function is a class member, its signature includes the
Douglas Gregor57c9f4f2011-01-26 17:47:49 +00001050 // cv-qualifiers (if any) and ref-qualifier (if any) on the function itself.
John McCall68263142009-11-18 22:49:29 +00001051 //
1052 // As part of this, also check whether one of the member functions
1053 // is static, in which case they are not overloads (C++
1054 // 13.1p2). While not part of the definition of the signature,
1055 // this check is important to determine whether these functions
1056 // can be overloaded.
Richard Smith21c8fa82013-01-14 05:37:29 +00001057 CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1058 CXXMethodDecl *NewMethod = dyn_cast<CXXMethodDecl>(New);
John McCall68263142009-11-18 22:49:29 +00001059 if (OldMethod && NewMethod &&
Richard Smith21c8fa82013-01-14 05:37:29 +00001060 !OldMethod->isStatic() && !NewMethod->isStatic()) {
1061 if (OldMethod->getRefQualifier() != NewMethod->getRefQualifier()) {
1062 if (!UseUsingDeclRules &&
1063 (OldMethod->getRefQualifier() == RQ_None ||
1064 NewMethod->getRefQualifier() == RQ_None)) {
1065 // C++0x [over.load]p2:
1066 // - Member function declarations with the same name and the same
1067 // parameter-type-list as well as member function template
1068 // declarations with the same name, the same parameter-type-list, and
1069 // the same template parameter lists cannot be overloaded if any of
1070 // them, but not all, have a ref-qualifier (8.3.5).
Rafael Espindola2d1b0962013-03-14 03:07:35 +00001071 S.Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
Richard Smith21c8fa82013-01-14 05:37:29 +00001072 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
Rafael Espindola2d1b0962013-03-14 03:07:35 +00001073 S.Diag(OldMethod->getLocation(), diag::note_previous_declaration);
Richard Smith21c8fa82013-01-14 05:37:29 +00001074 }
1075 return true;
Douglas Gregorb145ee62011-01-26 21:20:37 +00001076 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001077
Richard Smith21c8fa82013-01-14 05:37:29 +00001078 // We may not have applied the implicit const for a constexpr member
1079 // function yet (because we haven't yet resolved whether this is a static
1080 // or non-static member function). Add it now, on the assumption that this
1081 // is a redeclaration of OldMethod.
1082 unsigned NewQuals = NewMethod->getTypeQualifiers();
Richard Smith714fcc12013-01-14 08:00:39 +00001083 if (NewMethod->isConstexpr() && !isa<CXXConstructorDecl>(NewMethod))
Richard Smith21c8fa82013-01-14 05:37:29 +00001084 NewQuals |= Qualifiers::Const;
1085 if (OldMethod->getTypeQualifiers() != NewQuals)
1086 return true;
Douglas Gregorb145ee62011-01-26 21:20:37 +00001087 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001088
John McCall68263142009-11-18 22:49:29 +00001089 // The signatures match; this is not an overload.
1090 return false;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001091}
1092
Rafael Espindola2d1b0962013-03-14 03:07:35 +00001093bool Sema::IsOverload(FunctionDecl *New, FunctionDecl *Old,
1094 bool UseUsingDeclRules) {
1095 if (!shouldTryToOverload(*this, New, Old, UseUsingDeclRules))
1096 return false;
1097
1098 // If both of the functions are extern "C", then they are not
1099 // overloads.
1100 if (!canBeOverloaded(*Old) && !canBeOverloaded(*New))
1101 return false;
1102
1103 return true;
1104}
1105
Argyrios Kyrtzidis572bbec2011-06-23 00:41:50 +00001106/// \brief Checks availability of the function depending on the current
1107/// function context. Inside an unavailable function, unavailability is ignored.
1108///
1109/// \returns true if \arg FD is unavailable and current context is inside
1110/// an available function, false otherwise.
1111bool Sema::isFunctionConsideredUnavailable(FunctionDecl *FD) {
1112 return FD->isUnavailable() && !cast<Decl>(CurContext)->isUnavailable();
1113}
1114
Sebastian Redlcf15cef2011-12-22 18:58:38 +00001115/// \brief Tries a user-defined conversion from From to ToType.
1116///
1117/// Produces an implicit conversion sequence for when a standard conversion
1118/// is not an option. See TryImplicitConversion for more information.
1119static ImplicitConversionSequence
1120TryUserDefinedConversion(Sema &S, Expr *From, QualType ToType,
1121 bool SuppressUserConversions,
1122 bool AllowExplicit,
1123 bool InOverloadResolution,
1124 bool CStyle,
1125 bool AllowObjCWritebackConversion) {
1126 ImplicitConversionSequence ICS;
1127
1128 if (SuppressUserConversions) {
1129 // We're not in the case above, so there is no conversion that
1130 // we can perform.
1131 ICS.setBad(BadConversionSequence::no_conversion, From, ToType);
1132 return ICS;
1133 }
1134
1135 // Attempt user-defined conversion.
1136 OverloadCandidateSet Conversions(From->getExprLoc());
1137 OverloadingResult UserDefResult
1138 = IsUserDefinedConversion(S, From, ToType, ICS.UserDefined, Conversions,
1139 AllowExplicit);
1140
1141 if (UserDefResult == OR_Success) {
1142 ICS.setUserDefined();
1143 // C++ [over.ics.user]p4:
1144 // A conversion of an expression of class type to the same class
1145 // type is given Exact Match rank, and a conversion of an
1146 // expression of class type to a base class of that type is
1147 // given Conversion rank, in spite of the fact that a copy
1148 // constructor (i.e., a user-defined conversion function) is
1149 // called for those cases.
1150 if (CXXConstructorDecl *Constructor
1151 = dyn_cast<CXXConstructorDecl>(ICS.UserDefined.ConversionFunction)) {
1152 QualType FromCanon
1153 = S.Context.getCanonicalType(From->getType().getUnqualifiedType());
1154 QualType ToCanon
1155 = S.Context.getCanonicalType(ToType).getUnqualifiedType();
1156 if (Constructor->isCopyConstructor() &&
1157 (FromCanon == ToCanon || S.IsDerivedFrom(FromCanon, ToCanon))) {
1158 // Turn this into a "standard" conversion sequence, so that it
1159 // gets ranked with standard conversion sequences.
1160 ICS.setStandard();
1161 ICS.Standard.setAsIdentityConversion();
1162 ICS.Standard.setFromType(From->getType());
1163 ICS.Standard.setAllToTypes(ToType);
1164 ICS.Standard.CopyConstructor = Constructor;
1165 if (ToCanon != FromCanon)
1166 ICS.Standard.Second = ICK_Derived_To_Base;
1167 }
1168 }
1169
1170 // C++ [over.best.ics]p4:
1171 // However, when considering the argument of a user-defined
1172 // conversion function that is a candidate by 13.3.1.3 when
1173 // invoked for the copying of the temporary in the second step
1174 // of a class copy-initialization, or by 13.3.1.4, 13.3.1.5, or
1175 // 13.3.1.6 in all cases, only standard conversion sequences and
1176 // ellipsis conversion sequences are allowed.
1177 if (SuppressUserConversions && ICS.isUserDefined()) {
1178 ICS.setBad(BadConversionSequence::suppressed_user, From, ToType);
1179 }
1180 } else if (UserDefResult == OR_Ambiguous && !SuppressUserConversions) {
1181 ICS.setAmbiguous();
1182 ICS.Ambiguous.setFromType(From->getType());
1183 ICS.Ambiguous.setToType(ToType);
1184 for (OverloadCandidateSet::iterator Cand = Conversions.begin();
1185 Cand != Conversions.end(); ++Cand)
1186 if (Cand->Viable)
1187 ICS.Ambiguous.addConversion(Cand->Function);
1188 } else {
1189 ICS.setBad(BadConversionSequence::no_conversion, From, ToType);
1190 }
1191
1192 return ICS;
1193}
1194
Douglas Gregor27c8dc02008-10-29 00:13:59 +00001195/// TryImplicitConversion - Attempt to perform an implicit conversion
1196/// from the given expression (Expr) to the given type (ToType). This
1197/// function returns an implicit conversion sequence that can be used
1198/// to perform the initialization. Given
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001199///
1200/// void f(float f);
1201/// void g(int i) { f(i); }
1202///
1203/// this routine would produce an implicit conversion sequence to
1204/// describe the initialization of f from i, which will be a standard
1205/// conversion sequence containing an lvalue-to-rvalue conversion (C++
1206/// 4.1) followed by a floating-integral conversion (C++ 4.9).
1207//
1208/// Note that this routine only determines how the conversion can be
1209/// performed; it does not actually perform the conversion. As such,
1210/// it will not produce any diagnostics if no conversion is available,
1211/// but will instead return an implicit conversion sequence of kind
1212/// "BadConversion".
Douglas Gregor225c41e2008-11-03 19:09:14 +00001213///
1214/// If @p SuppressUserConversions, then user-defined conversions are
1215/// not permitted.
Douglas Gregor09f41cf2009-01-14 15:45:31 +00001216/// If @p AllowExplicit, then explicit user-defined conversions are
1217/// permitted.
John McCallf85e1932011-06-15 23:02:42 +00001218///
1219/// \param AllowObjCWritebackConversion Whether we allow the Objective-C
1220/// writeback conversion, which allows __autoreleasing id* parameters to
1221/// be initialized with __strong id* or __weak id* arguments.
John McCall120d63c2010-08-24 20:38:10 +00001222static ImplicitConversionSequence
1223TryImplicitConversion(Sema &S, Expr *From, QualType ToType,
1224 bool SuppressUserConversions,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001225 bool AllowExplicit,
Douglas Gregor14d0aee2011-01-27 00:58:17 +00001226 bool InOverloadResolution,
John McCallf85e1932011-06-15 23:02:42 +00001227 bool CStyle,
1228 bool AllowObjCWritebackConversion) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001229 ImplicitConversionSequence ICS;
John McCall120d63c2010-08-24 20:38:10 +00001230 if (IsStandardConversion(S, From, ToType, InOverloadResolution,
John McCallf85e1932011-06-15 23:02:42 +00001231 ICS.Standard, CStyle, AllowObjCWritebackConversion)){
John McCall1d318332010-01-12 00:44:57 +00001232 ICS.setStandard();
John McCall5769d612010-02-08 23:07:23 +00001233 return ICS;
1234 }
1235
David Blaikie4e4d0842012-03-11 07:00:24 +00001236 if (!S.getLangOpts().CPlusPlus) {
John McCallb1bdc622010-02-25 01:37:24 +00001237 ICS.setBad(BadConversionSequence::no_conversion, From, ToType);
John McCall5769d612010-02-08 23:07:23 +00001238 return ICS;
1239 }
1240
Douglas Gregor604eb652010-08-11 02:15:33 +00001241 // C++ [over.ics.user]p4:
1242 // A conversion of an expression of class type to the same class
1243 // type is given Exact Match rank, and a conversion of an
1244 // expression of class type to a base class of that type is
1245 // given Conversion rank, in spite of the fact that a copy/move
1246 // constructor (i.e., a user-defined conversion function) is
1247 // called for those cases.
1248 QualType FromType = From->getType();
1249 if (ToType->getAs<RecordType>() && FromType->getAs<RecordType>() &&
John McCall120d63c2010-08-24 20:38:10 +00001250 (S.Context.hasSameUnqualifiedType(FromType, ToType) ||
1251 S.IsDerivedFrom(FromType, ToType))) {
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00001252 ICS.setStandard();
1253 ICS.Standard.setAsIdentityConversion();
1254 ICS.Standard.setFromType(FromType);
1255 ICS.Standard.setAllToTypes(ToType);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001256
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00001257 // We don't actually check at this point whether there is a valid
1258 // copy/move constructor, since overloading just assumes that it
1259 // exists. When we actually perform initialization, we'll find the
1260 // appropriate constructor to copy the returned object, if needed.
1261 ICS.Standard.CopyConstructor = 0;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001262
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00001263 // Determine whether this is considered a derived-to-base conversion.
John McCall120d63c2010-08-24 20:38:10 +00001264 if (!S.Context.hasSameUnqualifiedType(FromType, ToType))
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00001265 ICS.Standard.Second = ICK_Derived_To_Base;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001266
Douglas Gregor604eb652010-08-11 02:15:33 +00001267 return ICS;
1268 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001269
Sebastian Redlcf15cef2011-12-22 18:58:38 +00001270 return TryUserDefinedConversion(S, From, ToType, SuppressUserConversions,
1271 AllowExplicit, InOverloadResolution, CStyle,
1272 AllowObjCWritebackConversion);
Douglas Gregor60d62c22008-10-31 16:23:19 +00001273}
1274
John McCallf85e1932011-06-15 23:02:42 +00001275ImplicitConversionSequence
1276Sema::TryImplicitConversion(Expr *From, QualType ToType,
1277 bool SuppressUserConversions,
1278 bool AllowExplicit,
1279 bool InOverloadResolution,
1280 bool CStyle,
1281 bool AllowObjCWritebackConversion) {
1282 return clang::TryImplicitConversion(*this, From, ToType,
1283 SuppressUserConversions, AllowExplicit,
1284 InOverloadResolution, CStyle,
1285 AllowObjCWritebackConversion);
John McCall120d63c2010-08-24 20:38:10 +00001286}
1287
Douglas Gregor575c63a2010-04-16 22:27:05 +00001288/// PerformImplicitConversion - Perform an implicit conversion of the
John Wiegley429bb272011-04-08 18:41:53 +00001289/// expression From to the type ToType. Returns the
Douglas Gregor575c63a2010-04-16 22:27:05 +00001290/// converted expression. Flavor is the kind of conversion we're
1291/// performing, used in the error message. If @p AllowExplicit,
1292/// explicit user-defined conversions are permitted.
John Wiegley429bb272011-04-08 18:41:53 +00001293ExprResult
1294Sema::PerformImplicitConversion(Expr *From, QualType ToType,
Sebastian Redl091fffe2011-10-16 18:19:06 +00001295 AssignmentAction Action, bool AllowExplicit) {
Douglas Gregor575c63a2010-04-16 22:27:05 +00001296 ImplicitConversionSequence ICS;
Sebastian Redl091fffe2011-10-16 18:19:06 +00001297 return PerformImplicitConversion(From, ToType, Action, AllowExplicit, ICS);
Douglas Gregor575c63a2010-04-16 22:27:05 +00001298}
1299
John Wiegley429bb272011-04-08 18:41:53 +00001300ExprResult
1301Sema::PerformImplicitConversion(Expr *From, QualType ToType,
Douglas Gregor575c63a2010-04-16 22:27:05 +00001302 AssignmentAction Action, bool AllowExplicit,
Sebastian Redl091fffe2011-10-16 18:19:06 +00001303 ImplicitConversionSequence& ICS) {
John McCall3c3b7f92011-10-25 17:37:35 +00001304 if (checkPlaceholderForOverload(*this, From))
1305 return ExprError();
1306
John McCallf85e1932011-06-15 23:02:42 +00001307 // Objective-C ARC: Determine whether we will allow the writeback conversion.
1308 bool AllowObjCWritebackConversion
David Blaikie4e4d0842012-03-11 07:00:24 +00001309 = getLangOpts().ObjCAutoRefCount &&
John McCallf85e1932011-06-15 23:02:42 +00001310 (Action == AA_Passing || Action == AA_Sending);
John McCallf85e1932011-06-15 23:02:42 +00001311
John McCall120d63c2010-08-24 20:38:10 +00001312 ICS = clang::TryImplicitConversion(*this, From, ToType,
1313 /*SuppressUserConversions=*/false,
1314 AllowExplicit,
Douglas Gregor14d0aee2011-01-27 00:58:17 +00001315 /*InOverloadResolution=*/false,
John McCallf85e1932011-06-15 23:02:42 +00001316 /*CStyle=*/false,
1317 AllowObjCWritebackConversion);
Douglas Gregor575c63a2010-04-16 22:27:05 +00001318 return PerformImplicitConversion(From, ToType, ICS, Action);
1319}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001320
1321/// \brief Determine whether the conversion from FromType to ToType is a valid
Douglas Gregor43c79c22009-12-09 00:47:37 +00001322/// conversion that strips "noreturn" off the nested function type.
Chandler Carruth18e04612011-06-18 01:19:03 +00001323bool Sema::IsNoReturnConversion(QualType FromType, QualType ToType,
1324 QualType &ResultTy) {
Douglas Gregor43c79c22009-12-09 00:47:37 +00001325 if (Context.hasSameUnqualifiedType(FromType, ToType))
1326 return false;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001327
John McCall00ccbef2010-12-21 00:44:39 +00001328 // Permit the conversion F(t __attribute__((noreturn))) -> F(t)
1329 // where F adds one of the following at most once:
1330 // - a pointer
1331 // - a member pointer
1332 // - a block pointer
1333 CanQualType CanTo = Context.getCanonicalType(ToType);
1334 CanQualType CanFrom = Context.getCanonicalType(FromType);
1335 Type::TypeClass TyClass = CanTo->getTypeClass();
1336 if (TyClass != CanFrom->getTypeClass()) return false;
1337 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1338 if (TyClass == Type::Pointer) {
1339 CanTo = CanTo.getAs<PointerType>()->getPointeeType();
1340 CanFrom = CanFrom.getAs<PointerType>()->getPointeeType();
1341 } else if (TyClass == Type::BlockPointer) {
1342 CanTo = CanTo.getAs<BlockPointerType>()->getPointeeType();
1343 CanFrom = CanFrom.getAs<BlockPointerType>()->getPointeeType();
1344 } else if (TyClass == Type::MemberPointer) {
1345 CanTo = CanTo.getAs<MemberPointerType>()->getPointeeType();
1346 CanFrom = CanFrom.getAs<MemberPointerType>()->getPointeeType();
1347 } else {
1348 return false;
1349 }
Douglas Gregor43c79c22009-12-09 00:47:37 +00001350
John McCall00ccbef2010-12-21 00:44:39 +00001351 TyClass = CanTo->getTypeClass();
1352 if (TyClass != CanFrom->getTypeClass()) return false;
1353 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1354 return false;
1355 }
1356
1357 const FunctionType *FromFn = cast<FunctionType>(CanFrom);
1358 FunctionType::ExtInfo EInfo = FromFn->getExtInfo();
1359 if (!EInfo.getNoReturn()) return false;
1360
1361 FromFn = Context.adjustFunctionType(FromFn, EInfo.withNoReturn(false));
1362 assert(QualType(FromFn, 0).isCanonical());
1363 if (QualType(FromFn, 0) != CanTo) return false;
1364
1365 ResultTy = ToType;
Douglas Gregor43c79c22009-12-09 00:47:37 +00001366 return true;
1367}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001368
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001369/// \brief Determine whether the conversion from FromType to ToType is a valid
1370/// vector conversion.
1371///
1372/// \param ICK Will be set to the vector conversion kind, if this is a vector
1373/// conversion.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001374static bool IsVectorConversion(ASTContext &Context, QualType FromType,
1375 QualType ToType, ImplicitConversionKind &ICK) {
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001376 // We need at least one of these types to be a vector type to have a vector
1377 // conversion.
1378 if (!ToType->isVectorType() && !FromType->isVectorType())
1379 return false;
1380
1381 // Identical types require no conversions.
1382 if (Context.hasSameUnqualifiedType(FromType, ToType))
1383 return false;
1384
1385 // There are no conversions between extended vector types, only identity.
1386 if (ToType->isExtVectorType()) {
1387 // There are no conversions between extended vector types other than the
1388 // identity conversion.
1389 if (FromType->isExtVectorType())
1390 return false;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001391
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001392 // Vector splat from any arithmetic type to a vector.
Douglas Gregor00619622010-06-22 23:41:02 +00001393 if (FromType->isArithmeticType()) {
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001394 ICK = ICK_Vector_Splat;
1395 return true;
1396 }
1397 }
Douglas Gregor255210e2010-08-06 10:14:59 +00001398
1399 // We can perform the conversion between vector types in the following cases:
1400 // 1)vector types are equivalent AltiVec and GCC vector types
1401 // 2)lax vector conversions are permitted and the vector types are of the
1402 // same size
1403 if (ToType->isVectorType() && FromType->isVectorType()) {
1404 if (Context.areCompatibleVectorTypes(FromType, ToType) ||
David Blaikie4e4d0842012-03-11 07:00:24 +00001405 (Context.getLangOpts().LaxVectorConversions &&
Chandler Carruthc45eb9c2010-08-08 05:02:51 +00001406 (Context.getTypeSize(FromType) == Context.getTypeSize(ToType)))) {
Douglas Gregor255210e2010-08-06 10:14:59 +00001407 ICK = ICK_Vector_Conversion;
1408 return true;
1409 }
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001410 }
Douglas Gregor255210e2010-08-06 10:14:59 +00001411
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001412 return false;
1413}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001414
Douglas Gregor7d000652012-04-12 20:48:09 +00001415static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType,
1416 bool InOverloadResolution,
1417 StandardConversionSequence &SCS,
1418 bool CStyle);
Douglas Gregorf7ecc302012-04-12 17:51:55 +00001419
Douglas Gregor60d62c22008-10-31 16:23:19 +00001420/// IsStandardConversion - Determines whether there is a standard
1421/// conversion sequence (C++ [conv], C++ [over.ics.scs]) from the
1422/// expression From to the type ToType. Standard conversion sequences
1423/// only consider non-class types; for conversions that involve class
1424/// types, use TryImplicitConversion. If a conversion exists, SCS will
1425/// contain the standard conversion sequence required to perform this
1426/// conversion and this routine will return true. Otherwise, this
1427/// routine will return false and the value of SCS is unspecified.
John McCall120d63c2010-08-24 20:38:10 +00001428static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
1429 bool InOverloadResolution,
Douglas Gregor14d0aee2011-01-27 00:58:17 +00001430 StandardConversionSequence &SCS,
John McCallf85e1932011-06-15 23:02:42 +00001431 bool CStyle,
1432 bool AllowObjCWritebackConversion) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001433 QualType FromType = From->getType();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001434
Douglas Gregor60d62c22008-10-31 16:23:19 +00001435 // Standard conversions (C++ [conv])
Douglas Gregoreb8f3062008-11-12 17:17:38 +00001436 SCS.setAsIdentityConversion();
Douglas Gregora9bff302010-02-28 18:30:25 +00001437 SCS.DeprecatedStringLiteralToCharPtr = false;
Douglas Gregor45920e82008-12-19 17:40:08 +00001438 SCS.IncompatibleObjC = false;
John McCall1d318332010-01-12 00:44:57 +00001439 SCS.setFromType(FromType);
Douglas Gregor225c41e2008-11-03 19:09:14 +00001440 SCS.CopyConstructor = 0;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001441
Douglas Gregorf9201e02009-02-11 23:02:49 +00001442 // There are no standard conversions for class types in C++, so
Mike Stump1eb44332009-09-09 15:08:12 +00001443 // abort early. When overloading in C, however, we do permit
Douglas Gregorf9201e02009-02-11 23:02:49 +00001444 if (FromType->isRecordType() || ToType->isRecordType()) {
David Blaikie4e4d0842012-03-11 07:00:24 +00001445 if (S.getLangOpts().CPlusPlus)
Douglas Gregorf9201e02009-02-11 23:02:49 +00001446 return false;
1447
Mike Stump1eb44332009-09-09 15:08:12 +00001448 // When we're overloading in C, we allow, as standard conversions,
Douglas Gregorf9201e02009-02-11 23:02:49 +00001449 }
1450
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001451 // The first conversion can be an lvalue-to-rvalue conversion,
1452 // array-to-pointer conversion, or function-to-pointer conversion
1453 // (C++ 4p1).
1454
John McCall120d63c2010-08-24 20:38:10 +00001455 if (FromType == S.Context.OverloadTy) {
Douglas Gregorad4e02f2010-04-29 18:24:40 +00001456 DeclAccessPair AccessPair;
1457 if (FunctionDecl *Fn
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001458 = S.ResolveAddressOfOverloadedFunction(From, ToType, false,
John McCall120d63c2010-08-24 20:38:10 +00001459 AccessPair)) {
Douglas Gregorad4e02f2010-04-29 18:24:40 +00001460 // We were able to resolve the address of the overloaded function,
1461 // so we can convert to the type of that function.
1462 FromType = Fn->getType();
Douglas Gregor1be8eec2011-02-19 21:32:49 +00001463
1464 // we can sometimes resolve &foo<int> regardless of ToType, so check
1465 // if the type matches (identity) or we are converting to bool
1466 if (!S.Context.hasSameUnqualifiedType(
1467 S.ExtractUnqualifiedFunctionType(ToType), FromType)) {
1468 QualType resultTy;
1469 // if the function type matches except for [[noreturn]], it's ok
Chandler Carruth18e04612011-06-18 01:19:03 +00001470 if (!S.IsNoReturnConversion(FromType,
Douglas Gregor1be8eec2011-02-19 21:32:49 +00001471 S.ExtractUnqualifiedFunctionType(ToType), resultTy))
1472 // otherwise, only a boolean conversion is standard
1473 if (!ToType->isBooleanType())
1474 return false;
Douglas Gregorad4e02f2010-04-29 18:24:40 +00001475 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001476
Chandler Carruth90434232011-03-29 08:08:18 +00001477 // Check if the "from" expression is taking the address of an overloaded
1478 // function and recompute the FromType accordingly. Take advantage of the
1479 // fact that non-static member functions *must* have such an address-of
1480 // expression.
1481 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Fn);
1482 if (Method && !Method->isStatic()) {
1483 assert(isa<UnaryOperator>(From->IgnoreParens()) &&
1484 "Non-unary operator on non-static member address");
1485 assert(cast<UnaryOperator>(From->IgnoreParens())->getOpcode()
1486 == UO_AddrOf &&
1487 "Non-address-of operator on non-static member address");
1488 const Type *ClassType
1489 = S.Context.getTypeDeclType(Method->getParent()).getTypePtr();
1490 FromType = S.Context.getMemberPointerType(FromType, ClassType);
Chandler Carruthfc5c8fc2011-03-29 18:38:10 +00001491 } else if (isa<UnaryOperator>(From->IgnoreParens())) {
1492 assert(cast<UnaryOperator>(From->IgnoreParens())->getOpcode() ==
1493 UO_AddrOf &&
Chandler Carruth90434232011-03-29 08:08:18 +00001494 "Non-address-of operator for overloaded function expression");
1495 FromType = S.Context.getPointerType(FromType);
1496 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001497
Douglas Gregorad4e02f2010-04-29 18:24:40 +00001498 // Check that we've computed the proper type after overload resolution.
Chandler Carruth90434232011-03-29 08:08:18 +00001499 assert(S.Context.hasSameType(
1500 FromType,
1501 S.FixOverloadedFunctionReference(From, AccessPair, Fn)->getType()));
Douglas Gregorad4e02f2010-04-29 18:24:40 +00001502 } else {
1503 return false;
1504 }
Anders Carlsson2bd62502010-11-04 05:28:09 +00001505 }
John McCall21480112011-08-30 00:57:29 +00001506 // Lvalue-to-rvalue conversion (C++11 4.1):
1507 // A glvalue (3.10) of a non-function, non-array type T can
1508 // be converted to a prvalue.
1509 bool argIsLValue = From->isGLValue();
John McCall7eb0a9e2010-11-24 05:12:34 +00001510 if (argIsLValue &&
Douglas Gregor904eed32008-11-10 20:40:00 +00001511 !FromType->isFunctionType() && !FromType->isArrayType() &&
John McCall120d63c2010-08-24 20:38:10 +00001512 S.Context.getCanonicalType(FromType) != S.Context.OverloadTy) {
Douglas Gregor60d62c22008-10-31 16:23:19 +00001513 SCS.First = ICK_Lvalue_To_Rvalue;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001514
Douglas Gregorf7ecc302012-04-12 17:51:55 +00001515 // C11 6.3.2.1p2:
1516 // ... if the lvalue has atomic type, the value has the non-atomic version
1517 // of the type of the lvalue ...
1518 if (const AtomicType *Atomic = FromType->getAs<AtomicType>())
1519 FromType = Atomic->getValueType();
1520
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001521 // If T is a non-class type, the type of the rvalue is the
1522 // cv-unqualified version of T. Otherwise, the type of the rvalue
Douglas Gregorf9201e02009-02-11 23:02:49 +00001523 // is T (C++ 4.1p1). C++ can't get here with class types; in C, we
1524 // just strip the qualifiers because they don't matter.
Douglas Gregor60d62c22008-10-31 16:23:19 +00001525 FromType = FromType.getUnqualifiedType();
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001526 } else if (FromType->isArrayType()) {
1527 // Array-to-pointer conversion (C++ 4.2)
Douglas Gregor60d62c22008-10-31 16:23:19 +00001528 SCS.First = ICK_Array_To_Pointer;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001529
1530 // An lvalue or rvalue of type "array of N T" or "array of unknown
1531 // bound of T" can be converted to an rvalue of type "pointer to
1532 // T" (C++ 4.2p1).
John McCall120d63c2010-08-24 20:38:10 +00001533 FromType = S.Context.getArrayDecayedType(FromType);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001534
John McCall120d63c2010-08-24 20:38:10 +00001535 if (S.IsStringLiteralToNonConstPointerConversion(From, ToType)) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001536 // This conversion is deprecated. (C++ D.4).
Douglas Gregora9bff302010-02-28 18:30:25 +00001537 SCS.DeprecatedStringLiteralToCharPtr = true;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001538
1539 // For the purpose of ranking in overload resolution
1540 // (13.3.3.1.1), this conversion is considered an
1541 // array-to-pointer conversion followed by a qualification
1542 // conversion (4.4). (C++ 4.2p2)
Douglas Gregor60d62c22008-10-31 16:23:19 +00001543 SCS.Second = ICK_Identity;
1544 SCS.Third = ICK_Qualification;
John McCallf85e1932011-06-15 23:02:42 +00001545 SCS.QualificationIncludesObjCLifetime = false;
Douglas Gregorad323a82010-01-27 03:51:04 +00001546 SCS.setAllToTypes(FromType);
Douglas Gregor60d62c22008-10-31 16:23:19 +00001547 return true;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001548 }
John McCall7eb0a9e2010-11-24 05:12:34 +00001549 } else if (FromType->isFunctionType() && argIsLValue) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001550 // Function-to-pointer conversion (C++ 4.3).
Douglas Gregor60d62c22008-10-31 16:23:19 +00001551 SCS.First = ICK_Function_To_Pointer;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001552
1553 // An lvalue of function type T can be converted to an rvalue of
1554 // type "pointer to T." The result is a pointer to the
1555 // function. (C++ 4.3p1).
John McCall120d63c2010-08-24 20:38:10 +00001556 FromType = S.Context.getPointerType(FromType);
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001557 } else {
1558 // We don't require any conversions for the first step.
Douglas Gregor60d62c22008-10-31 16:23:19 +00001559 SCS.First = ICK_Identity;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001560 }
Douglas Gregorad323a82010-01-27 03:51:04 +00001561 SCS.setToType(0, FromType);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001562
1563 // The second conversion can be an integral promotion, floating
1564 // point promotion, integral conversion, floating point conversion,
1565 // floating-integral conversion, pointer conversion,
1566 // pointer-to-member conversion, or boolean conversion (C++ 4p1).
Douglas Gregorf9201e02009-02-11 23:02:49 +00001567 // For overloading in C, this can also be a "compatible-type"
1568 // conversion.
Douglas Gregor45920e82008-12-19 17:40:08 +00001569 bool IncompatibleObjC = false;
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001570 ImplicitConversionKind SecondICK = ICK_Identity;
John McCall120d63c2010-08-24 20:38:10 +00001571 if (S.Context.hasSameUnqualifiedType(FromType, ToType)) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001572 // The unqualified versions of the types are the same: there's no
1573 // conversion to do.
Douglas Gregor60d62c22008-10-31 16:23:19 +00001574 SCS.Second = ICK_Identity;
John McCall120d63c2010-08-24 20:38:10 +00001575 } else if (S.IsIntegralPromotion(From, FromType, ToType)) {
Mike Stump1eb44332009-09-09 15:08:12 +00001576 // Integral promotion (C++ 4.5).
Douglas Gregor60d62c22008-10-31 16:23:19 +00001577 SCS.Second = ICK_Integral_Promotion;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001578 FromType = ToType.getUnqualifiedType();
John McCall120d63c2010-08-24 20:38:10 +00001579 } else if (S.IsFloatingPointPromotion(FromType, ToType)) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001580 // Floating point promotion (C++ 4.6).
Douglas Gregor60d62c22008-10-31 16:23:19 +00001581 SCS.Second = ICK_Floating_Promotion;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001582 FromType = ToType.getUnqualifiedType();
John McCall120d63c2010-08-24 20:38:10 +00001583 } else if (S.IsComplexPromotion(FromType, ToType)) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001584 // Complex promotion (Clang extension)
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001585 SCS.Second = ICK_Complex_Promotion;
1586 FromType = ToType.getUnqualifiedType();
John McCalldaa8e4e2010-11-15 09:13:47 +00001587 } else if (ToType->isBooleanType() &&
1588 (FromType->isArithmeticType() ||
1589 FromType->isAnyPointerType() ||
1590 FromType->isBlockPointerType() ||
1591 FromType->isMemberPointerType() ||
1592 FromType->isNullPtrType())) {
1593 // Boolean conversions (C++ 4.12).
1594 SCS.Second = ICK_Boolean_Conversion;
1595 FromType = S.Context.BoolTy;
Douglas Gregor1274ccd2010-10-08 23:50:27 +00001596 } else if (FromType->isIntegralOrUnscopedEnumerationType() &&
John McCall120d63c2010-08-24 20:38:10 +00001597 ToType->isIntegralType(S.Context)) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001598 // Integral conversions (C++ 4.7).
Douglas Gregor60d62c22008-10-31 16:23:19 +00001599 SCS.Second = ICK_Integral_Conversion;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001600 FromType = ToType.getUnqualifiedType();
Richard Smith42860f12013-05-10 20:29:50 +00001601 } else if (FromType->isAnyComplexType() && ToType->isAnyComplexType()) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001602 // Complex conversions (C99 6.3.1.6)
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001603 SCS.Second = ICK_Complex_Conversion;
1604 FromType = ToType.getUnqualifiedType();
John McCalldaa8e4e2010-11-15 09:13:47 +00001605 } else if ((FromType->isAnyComplexType() && ToType->isArithmeticType()) ||
1606 (ToType->isAnyComplexType() && FromType->isArithmeticType())) {
Chandler Carruth23a370f2010-02-25 07:20:54 +00001607 // Complex-real conversions (C99 6.3.1.7)
1608 SCS.Second = ICK_Complex_Real;
1609 FromType = ToType.getUnqualifiedType();
Douglas Gregor0c293ea2010-06-22 23:07:26 +00001610 } else if (FromType->isRealFloatingType() && ToType->isRealFloatingType()) {
Chandler Carruth23a370f2010-02-25 07:20:54 +00001611 // Floating point conversions (C++ 4.8).
1612 SCS.Second = ICK_Floating_Conversion;
1613 FromType = ToType.getUnqualifiedType();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001614 } else if ((FromType->isRealFloatingType() &&
John McCalldaa8e4e2010-11-15 09:13:47 +00001615 ToType->isIntegralType(S.Context)) ||
Douglas Gregor1274ccd2010-10-08 23:50:27 +00001616 (FromType->isIntegralOrUnscopedEnumerationType() &&
Douglas Gregor0c293ea2010-06-22 23:07:26 +00001617 ToType->isRealFloatingType())) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001618 // Floating-integral conversions (C++ 4.9).
Douglas Gregor60d62c22008-10-31 16:23:19 +00001619 SCS.Second = ICK_Floating_Integral;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001620 FromType = ToType.getUnqualifiedType();
Fariborz Jahaniane3c8c642011-02-12 19:07:46 +00001621 } else if (S.IsBlockPointerConversion(FromType, ToType, FromType)) {
John McCallf85e1932011-06-15 23:02:42 +00001622 SCS.Second = ICK_Block_Pointer_Conversion;
1623 } else if (AllowObjCWritebackConversion &&
1624 S.isObjCWritebackConversion(FromType, ToType, FromType)) {
1625 SCS.Second = ICK_Writeback_Conversion;
John McCall120d63c2010-08-24 20:38:10 +00001626 } else if (S.IsPointerConversion(From, FromType, ToType, InOverloadResolution,
1627 FromType, IncompatibleObjC)) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001628 // Pointer conversions (C++ 4.10).
Douglas Gregor60d62c22008-10-31 16:23:19 +00001629 SCS.Second = ICK_Pointer_Conversion;
Douglas Gregor45920e82008-12-19 17:40:08 +00001630 SCS.IncompatibleObjC = IncompatibleObjC;
Douglas Gregor028ea4b2011-04-26 23:16:46 +00001631 FromType = FromType.getUnqualifiedType();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001632 } else if (S.IsMemberPointerConversion(From, FromType, ToType,
John McCall120d63c2010-08-24 20:38:10 +00001633 InOverloadResolution, FromType)) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001634 // Pointer to member conversions (4.11).
Sebastian Redl4433aaf2009-01-25 19:43:20 +00001635 SCS.Second = ICK_Pointer_Member;
John McCall120d63c2010-08-24 20:38:10 +00001636 } else if (IsVectorConversion(S.Context, FromType, ToType, SecondICK)) {
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001637 SCS.Second = SecondICK;
1638 FromType = ToType.getUnqualifiedType();
David Blaikie4e4d0842012-03-11 07:00:24 +00001639 } else if (!S.getLangOpts().CPlusPlus &&
John McCall120d63c2010-08-24 20:38:10 +00001640 S.Context.typesAreCompatible(ToType, FromType)) {
Mike Stumpac5fc7c2009-08-04 21:02:39 +00001641 // Compatible conversions (Clang extension for C function overloading)
Douglas Gregorf9201e02009-02-11 23:02:49 +00001642 SCS.Second = ICK_Compatible_Conversion;
Douglas Gregorfb4a5432010-05-18 22:42:18 +00001643 FromType = ToType.getUnqualifiedType();
Chandler Carruth18e04612011-06-18 01:19:03 +00001644 } else if (S.IsNoReturnConversion(FromType, ToType, FromType)) {
Douglas Gregor43c79c22009-12-09 00:47:37 +00001645 // Treat a conversion that strips "noreturn" as an identity conversion.
1646 SCS.Second = ICK_NoReturn_Adjustment;
Fariborz Jahaniand97f5582011-03-23 19:50:54 +00001647 } else if (IsTransparentUnionStandardConversion(S, From, ToType,
1648 InOverloadResolution,
1649 SCS, CStyle)) {
1650 SCS.Second = ICK_TransparentUnionConversion;
1651 FromType = ToType;
Douglas Gregor7d000652012-04-12 20:48:09 +00001652 } else if (tryAtomicConversion(S, From, ToType, InOverloadResolution, SCS,
1653 CStyle)) {
1654 // tryAtomicConversion has updated the standard conversion sequence
Douglas Gregorf7ecc302012-04-12 17:51:55 +00001655 // appropriately.
1656 return true;
Guy Benyei6959acd2013-02-07 16:05:33 +00001657 } else if (ToType->isEventT() &&
1658 From->isIntegerConstantExpr(S.getASTContext()) &&
1659 (From->EvaluateKnownConstInt(S.getASTContext()) == 0)) {
1660 SCS.Second = ICK_Zero_Event_Conversion;
1661 FromType = ToType;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001662 } else {
1663 // No second conversion required.
Douglas Gregor60d62c22008-10-31 16:23:19 +00001664 SCS.Second = ICK_Identity;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001665 }
Douglas Gregorad323a82010-01-27 03:51:04 +00001666 SCS.setToType(1, FromType);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001667
Douglas Gregor27c8dc02008-10-29 00:13:59 +00001668 QualType CanonFrom;
1669 QualType CanonTo;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001670 // The third conversion can be a qualification conversion (C++ 4p1).
John McCallf85e1932011-06-15 23:02:42 +00001671 bool ObjCLifetimeConversion;
1672 if (S.IsQualificationConversion(FromType, ToType, CStyle,
1673 ObjCLifetimeConversion)) {
Douglas Gregor60d62c22008-10-31 16:23:19 +00001674 SCS.Third = ICK_Qualification;
John McCallf85e1932011-06-15 23:02:42 +00001675 SCS.QualificationIncludesObjCLifetime = ObjCLifetimeConversion;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001676 FromType = ToType;
John McCall120d63c2010-08-24 20:38:10 +00001677 CanonFrom = S.Context.getCanonicalType(FromType);
1678 CanonTo = S.Context.getCanonicalType(ToType);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001679 } else {
1680 // No conversion required
Douglas Gregor60d62c22008-10-31 16:23:19 +00001681 SCS.Third = ICK_Identity;
1682
Mike Stump1eb44332009-09-09 15:08:12 +00001683 // C++ [over.best.ics]p6:
Douglas Gregor60d62c22008-10-31 16:23:19 +00001684 // [...] Any difference in top-level cv-qualification is
1685 // subsumed by the initialization itself and does not constitute
1686 // a conversion. [...]
John McCall120d63c2010-08-24 20:38:10 +00001687 CanonFrom = S.Context.getCanonicalType(FromType);
1688 CanonTo = S.Context.getCanonicalType(ToType);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001689 if (CanonFrom.getLocalUnqualifiedType()
Douglas Gregora4923eb2009-11-16 21:35:15 +00001690 == CanonTo.getLocalUnqualifiedType() &&
Matt Arsenault5509f372013-02-26 21:15:54 +00001691 CanonFrom.getLocalQualifiers() != CanonTo.getLocalQualifiers()) {
Douglas Gregor27c8dc02008-10-29 00:13:59 +00001692 FromType = ToType;
1693 CanonFrom = CanonTo;
1694 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001695 }
Douglas Gregorad323a82010-01-27 03:51:04 +00001696 SCS.setToType(2, FromType);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001697
1698 // If we have not converted the argument type to the parameter type,
1699 // this is a bad conversion sequence.
Douglas Gregor27c8dc02008-10-29 00:13:59 +00001700 if (CanonFrom != CanonTo)
Douglas Gregor60d62c22008-10-31 16:23:19 +00001701 return false;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001702
Douglas Gregor60d62c22008-10-31 16:23:19 +00001703 return true;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001704}
Fariborz Jahaniand97f5582011-03-23 19:50:54 +00001705
1706static bool
1707IsTransparentUnionStandardConversion(Sema &S, Expr* From,
1708 QualType &ToType,
1709 bool InOverloadResolution,
1710 StandardConversionSequence &SCS,
1711 bool CStyle) {
1712
1713 const RecordType *UT = ToType->getAsUnionType();
1714 if (!UT || !UT->getDecl()->hasAttr<TransparentUnionAttr>())
1715 return false;
1716 // The field to initialize within the transparent union.
1717 RecordDecl *UD = UT->getDecl();
1718 // It's compatible if the expression matches any of the fields.
1719 for (RecordDecl::field_iterator it = UD->field_begin(),
1720 itend = UD->field_end();
1721 it != itend; ++it) {
John McCallf85e1932011-06-15 23:02:42 +00001722 if (IsStandardConversion(S, From, it->getType(), InOverloadResolution, SCS,
1723 CStyle, /*ObjCWritebackConversion=*/false)) {
Fariborz Jahaniand97f5582011-03-23 19:50:54 +00001724 ToType = it->getType();
1725 return true;
1726 }
1727 }
1728 return false;
1729}
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001730
1731/// IsIntegralPromotion - Determines whether the conversion from the
1732/// expression From (whose potentially-adjusted type is FromType) to
1733/// ToType is an integral promotion (C++ 4.5). If so, returns true and
1734/// sets PromotedType to the promoted type.
Mike Stump1eb44332009-09-09 15:08:12 +00001735bool Sema::IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType) {
John McCall183700f2009-09-21 23:43:11 +00001736 const BuiltinType *To = ToType->getAs<BuiltinType>();
Sebastian Redlf7be9442008-11-04 15:59:10 +00001737 // All integers are built-in.
Sebastian Redl07779722008-10-31 14:43:28 +00001738 if (!To) {
1739 return false;
1740 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001741
1742 // An rvalue of type char, signed char, unsigned char, short int, or
1743 // unsigned short int can be converted to an rvalue of type int if
1744 // int can represent all the values of the source type; otherwise,
1745 // the source rvalue can be converted to an rvalue of type unsigned
1746 // int (C++ 4.5p1).
Douglas Gregoraa74a1e2010-02-02 20:10:50 +00001747 if (FromType->isPromotableIntegerType() && !FromType->isBooleanType() &&
1748 !FromType->isEnumeralType()) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001749 if (// We can promote any signed, promotable integer type to an int
1750 (FromType->isSignedIntegerType() ||
1751 // We can promote any unsigned integer type whose size is
1752 // less than int to an int.
Mike Stump1eb44332009-09-09 15:08:12 +00001753 (!FromType->isSignedIntegerType() &&
Sebastian Redl07779722008-10-31 14:43:28 +00001754 Context.getTypeSize(FromType) < Context.getTypeSize(ToType)))) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001755 return To->getKind() == BuiltinType::Int;
Sebastian Redl07779722008-10-31 14:43:28 +00001756 }
1757
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001758 return To->getKind() == BuiltinType::UInt;
1759 }
1760
Richard Smithe7ff9192012-09-13 21:18:54 +00001761 // C++11 [conv.prom]p3:
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001762 // A prvalue of an unscoped enumeration type whose underlying type is not
1763 // fixed (7.2) can be converted to an rvalue a prvalue of the first of the
1764 // following types that can represent all the values of the enumeration
1765 // (i.e., the values in the range bmin to bmax as described in 7.2): int,
1766 // unsigned int, long int, unsigned long int, long long int, or unsigned
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001767 // long long int. If none of the types in that list can represent all the
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001768 // values of the enumeration, an rvalue a prvalue of an unscoped enumeration
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001769 // type can be converted to an rvalue a prvalue of the extended integer type
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001770 // with lowest integer conversion rank (4.13) greater than the rank of long
1771 // long in which all the values of the enumeration can be represented. If
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001772 // there are two such extended types, the signed one is chosen.
Richard Smithe7ff9192012-09-13 21:18:54 +00001773 // C++11 [conv.prom]p4:
1774 // A prvalue of an unscoped enumeration type whose underlying type is fixed
1775 // can be converted to a prvalue of its underlying type. Moreover, if
1776 // integral promotion can be applied to its underlying type, a prvalue of an
1777 // unscoped enumeration type whose underlying type is fixed can also be
1778 // converted to a prvalue of the promoted underlying type.
Douglas Gregor1274ccd2010-10-08 23:50:27 +00001779 if (const EnumType *FromEnumType = FromType->getAs<EnumType>()) {
1780 // C++0x 7.2p9: Note that this implicit enum to int conversion is not
1781 // provided for a scoped enumeration.
1782 if (FromEnumType->getDecl()->isScoped())
1783 return false;
1784
Richard Smithe7ff9192012-09-13 21:18:54 +00001785 // We can perform an integral promotion to the underlying type of the enum,
1786 // even if that's not the promoted type.
1787 if (FromEnumType->getDecl()->isFixed()) {
1788 QualType Underlying = FromEnumType->getDecl()->getIntegerType();
1789 return Context.hasSameUnqualifiedType(Underlying, ToType) ||
1790 IsIntegralPromotion(From, Underlying, ToType);
1791 }
1792
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001793 // We have already pre-calculated the promotion type, so this is trivial.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001794 if (ToType->isIntegerType() &&
Douglas Gregord10099e2012-05-04 16:32:21 +00001795 !RequireCompleteType(From->getLocStart(), FromType, 0))
John McCall842aef82009-12-09 09:09:27 +00001796 return Context.hasSameUnqualifiedType(ToType,
1797 FromEnumType->getDecl()->getPromotionType());
Douglas Gregor1274ccd2010-10-08 23:50:27 +00001798 }
John McCall842aef82009-12-09 09:09:27 +00001799
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001800 // C++0x [conv.prom]p2:
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001801 // A prvalue of type char16_t, char32_t, or wchar_t (3.9.1) can be converted
1802 // to an rvalue a prvalue of the first of the following types that can
1803 // represent all the values of its underlying type: int, unsigned int,
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001804 // long int, unsigned long int, long long int, or unsigned long long int.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001805 // If none of the types in that list can represent all the values of its
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001806 // underlying type, an rvalue a prvalue of type char16_t, char32_t,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001807 // or wchar_t can be converted to an rvalue a prvalue of its underlying
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001808 // type.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001809 if (FromType->isAnyCharacterType() && !FromType->isCharType() &&
Douglas Gregor0b8ddb92010-10-21 18:04:08 +00001810 ToType->isIntegerType()) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001811 // Determine whether the type we're converting from is signed or
1812 // unsigned.
David Majnemer0ad92312011-07-22 21:09:04 +00001813 bool FromIsSigned = FromType->isSignedIntegerType();
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001814 uint64_t FromSize = Context.getTypeSize(FromType);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001815
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001816 // The types we'll try to promote to, in the appropriate
1817 // order. Try each of these types.
Mike Stump1eb44332009-09-09 15:08:12 +00001818 QualType PromoteTypes[6] = {
1819 Context.IntTy, Context.UnsignedIntTy,
Douglas Gregorc9467cf2008-12-12 02:00:36 +00001820 Context.LongTy, Context.UnsignedLongTy ,
1821 Context.LongLongTy, Context.UnsignedLongLongTy
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001822 };
Douglas Gregorc9467cf2008-12-12 02:00:36 +00001823 for (int Idx = 0; Idx < 6; ++Idx) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001824 uint64_t ToSize = Context.getTypeSize(PromoteTypes[Idx]);
1825 if (FromSize < ToSize ||
Mike Stump1eb44332009-09-09 15:08:12 +00001826 (FromSize == ToSize &&
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001827 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
1828 // We found the type that we can promote to. If this is the
1829 // type we wanted, we have a promotion. Otherwise, no
1830 // promotion.
Douglas Gregora4923eb2009-11-16 21:35:15 +00001831 return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001832 }
1833 }
1834 }
1835
1836 // An rvalue for an integral bit-field (9.6) can be converted to an
1837 // rvalue of type int if int can represent all the values of the
1838 // bit-field; otherwise, it can be converted to unsigned int if
1839 // unsigned int can represent all the values of the bit-field. If
1840 // the bit-field is larger yet, no integral promotion applies to
1841 // it. If the bit-field has an enumerated type, it is treated as any
1842 // other value of that type for promotion purposes (C++ 4.5p3).
Mike Stump390b4cc2009-05-16 07:39:55 +00001843 // FIXME: We should delay checking of bit-fields until we actually perform the
1844 // conversion.
Douglas Gregor33bbbc52009-05-02 02:18:30 +00001845 using llvm::APSInt;
1846 if (From)
John McCall993f43f2013-05-06 21:39:12 +00001847 if (FieldDecl *MemberDecl = From->getSourceBitField()) {
Douglas Gregor86f19402008-12-20 23:49:58 +00001848 APSInt BitWidth;
Douglas Gregor9d3347a2010-06-16 00:35:25 +00001849 if (FromType->isIntegralType(Context) &&
Douglas Gregor33bbbc52009-05-02 02:18:30 +00001850 MemberDecl->getBitWidth()->isIntegerConstantExpr(BitWidth, Context)) {
1851 APSInt ToSize(BitWidth.getBitWidth(), BitWidth.isUnsigned());
1852 ToSize = Context.getTypeSize(ToType);
Mike Stump1eb44332009-09-09 15:08:12 +00001853
Douglas Gregor86f19402008-12-20 23:49:58 +00001854 // Are we promoting to an int from a bitfield that fits in an int?
1855 if (BitWidth < ToSize ||
1856 (FromType->isSignedIntegerType() && BitWidth <= ToSize)) {
1857 return To->getKind() == BuiltinType::Int;
1858 }
Mike Stump1eb44332009-09-09 15:08:12 +00001859
Douglas Gregor86f19402008-12-20 23:49:58 +00001860 // Are we promoting to an unsigned int from an unsigned bitfield
1861 // that fits into an unsigned int?
1862 if (FromType->isUnsignedIntegerType() && BitWidth <= ToSize) {
1863 return To->getKind() == BuiltinType::UInt;
1864 }
Mike Stump1eb44332009-09-09 15:08:12 +00001865
Douglas Gregor86f19402008-12-20 23:49:58 +00001866 return false;
Sebastian Redl07779722008-10-31 14:43:28 +00001867 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001868 }
Mike Stump1eb44332009-09-09 15:08:12 +00001869
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001870 // An rvalue of type bool can be converted to an rvalue of type int,
1871 // with false becoming zero and true becoming one (C++ 4.5p4).
Sebastian Redl07779722008-10-31 14:43:28 +00001872 if (FromType->isBooleanType() && To->getKind() == BuiltinType::Int) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001873 return true;
Sebastian Redl07779722008-10-31 14:43:28 +00001874 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001875
1876 return false;
1877}
1878
1879/// IsFloatingPointPromotion - Determines whether the conversion from
1880/// FromType to ToType is a floating point promotion (C++ 4.6). If so,
1881/// returns true and sets PromotedType to the promoted type.
Mike Stump1eb44332009-09-09 15:08:12 +00001882bool Sema::IsFloatingPointPromotion(QualType FromType, QualType ToType) {
John McCall183700f2009-09-21 23:43:11 +00001883 if (const BuiltinType *FromBuiltin = FromType->getAs<BuiltinType>())
1884 if (const BuiltinType *ToBuiltin = ToType->getAs<BuiltinType>()) {
Anton Korobeynikovaa4a99b2011-10-14 23:23:15 +00001885 /// An rvalue of type float can be converted to an rvalue of type
1886 /// double. (C++ 4.6p1).
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001887 if (FromBuiltin->getKind() == BuiltinType::Float &&
1888 ToBuiltin->getKind() == BuiltinType::Double)
1889 return true;
1890
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001891 // C99 6.3.1.5p1:
1892 // When a float is promoted to double or long double, or a
1893 // double is promoted to long double [...].
David Blaikie4e4d0842012-03-11 07:00:24 +00001894 if (!getLangOpts().CPlusPlus &&
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001895 (FromBuiltin->getKind() == BuiltinType::Float ||
1896 FromBuiltin->getKind() == BuiltinType::Double) &&
1897 (ToBuiltin->getKind() == BuiltinType::LongDouble))
1898 return true;
Anton Korobeynikovaa4a99b2011-10-14 23:23:15 +00001899
1900 // Half can be promoted to float.
Joey Gouly19dbb202013-01-23 11:56:20 +00001901 if (!getLangOpts().NativeHalfType &&
1902 FromBuiltin->getKind() == BuiltinType::Half &&
Anton Korobeynikovaa4a99b2011-10-14 23:23:15 +00001903 ToBuiltin->getKind() == BuiltinType::Float)
1904 return true;
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001905 }
1906
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001907 return false;
1908}
1909
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001910/// \brief Determine if a conversion is a complex promotion.
1911///
1912/// A complex promotion is defined as a complex -> complex conversion
1913/// where the conversion between the underlying real types is a
Douglas Gregorb7b5d132009-02-12 00:26:06 +00001914/// floating-point or integral promotion.
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001915bool Sema::IsComplexPromotion(QualType FromType, QualType ToType) {
John McCall183700f2009-09-21 23:43:11 +00001916 const ComplexType *FromComplex = FromType->getAs<ComplexType>();
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001917 if (!FromComplex)
1918 return false;
1919
John McCall183700f2009-09-21 23:43:11 +00001920 const ComplexType *ToComplex = ToType->getAs<ComplexType>();
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001921 if (!ToComplex)
1922 return false;
1923
1924 return IsFloatingPointPromotion(FromComplex->getElementType(),
Douglas Gregorb7b5d132009-02-12 00:26:06 +00001925 ToComplex->getElementType()) ||
1926 IsIntegralPromotion(0, FromComplex->getElementType(),
1927 ToComplex->getElementType());
Douglas Gregor5cdf8212009-02-12 00:15:05 +00001928}
1929
Douglas Gregorcb7de522008-11-26 23:31:11 +00001930/// BuildSimilarlyQualifiedPointerType - In a pointer conversion from
1931/// the pointer type FromPtr to a pointer to type ToPointee, with the
1932/// same type qualifiers as FromPtr has on its pointee type. ToType,
1933/// if non-empty, will be a pointer to ToType that may or may not have
1934/// the right set of qualifiers on its pointee.
John McCallf85e1932011-06-15 23:02:42 +00001935///
Mike Stump1eb44332009-09-09 15:08:12 +00001936static QualType
Douglas Gregorda80f742010-12-01 21:43:58 +00001937BuildSimilarlyQualifiedPointerType(const Type *FromPtr,
Douglas Gregorcb7de522008-11-26 23:31:11 +00001938 QualType ToPointee, QualType ToType,
John McCallf85e1932011-06-15 23:02:42 +00001939 ASTContext &Context,
1940 bool StripObjCLifetime = false) {
Douglas Gregorda80f742010-12-01 21:43:58 +00001941 assert((FromPtr->getTypeClass() == Type::Pointer ||
1942 FromPtr->getTypeClass() == Type::ObjCObjectPointer) &&
1943 "Invalid similarly-qualified pointer type");
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001944
John McCallf85e1932011-06-15 23:02:42 +00001945 /// Conversions to 'id' subsume cv-qualifier conversions.
1946 if (ToType->isObjCIdType() || ToType->isObjCQualifiedIdType())
Douglas Gregor143c7ac2010-12-06 22:09:19 +00001947 return ToType.getUnqualifiedType();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001948
1949 QualType CanonFromPointee
Douglas Gregorda80f742010-12-01 21:43:58 +00001950 = Context.getCanonicalType(FromPtr->getPointeeType());
Douglas Gregorcb7de522008-11-26 23:31:11 +00001951 QualType CanonToPointee = Context.getCanonicalType(ToPointee);
John McCall0953e762009-09-24 19:53:00 +00001952 Qualifiers Quals = CanonFromPointee.getQualifiers();
Mike Stump1eb44332009-09-09 15:08:12 +00001953
John McCallf85e1932011-06-15 23:02:42 +00001954 if (StripObjCLifetime)
1955 Quals.removeObjCLifetime();
1956
Mike Stump1eb44332009-09-09 15:08:12 +00001957 // Exact qualifier match -> return the pointer type we're converting to.
Douglas Gregora4923eb2009-11-16 21:35:15 +00001958 if (CanonToPointee.getLocalQualifiers() == Quals) {
Douglas Gregorcb7de522008-11-26 23:31:11 +00001959 // ToType is exactly what we need. Return it.
John McCall0953e762009-09-24 19:53:00 +00001960 if (!ToType.isNull())
Douglas Gregoraf7bea52010-05-25 15:31:05 +00001961 return ToType.getUnqualifiedType();
Douglas Gregorcb7de522008-11-26 23:31:11 +00001962
1963 // Build a pointer to ToPointee. It has the right qualifiers
1964 // already.
Douglas Gregorda80f742010-12-01 21:43:58 +00001965 if (isa<ObjCObjectPointerType>(ToType))
1966 return Context.getObjCObjectPointerType(ToPointee);
Douglas Gregorcb7de522008-11-26 23:31:11 +00001967 return Context.getPointerType(ToPointee);
1968 }
1969
1970 // Just build a canonical type that has the right qualifiers.
Douglas Gregorda80f742010-12-01 21:43:58 +00001971 QualType QualifiedCanonToPointee
1972 = Context.getQualifiedType(CanonToPointee.getLocalUnqualifiedType(), Quals);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001973
Douglas Gregorda80f742010-12-01 21:43:58 +00001974 if (isa<ObjCObjectPointerType>(ToType))
1975 return Context.getObjCObjectPointerType(QualifiedCanonToPointee);
1976 return Context.getPointerType(QualifiedCanonToPointee);
Fariborz Jahanianadcfab12009-12-16 23:13:33 +00001977}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00001978
Mike Stump1eb44332009-09-09 15:08:12 +00001979static bool isNullPointerConstantForConversion(Expr *Expr,
Anders Carlssonbbf306b2009-08-28 15:55:56 +00001980 bool InOverloadResolution,
1981 ASTContext &Context) {
1982 // Handle value-dependent integral null pointer constants correctly.
1983 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903
1984 if (Expr->isValueDependent() && !Expr->isTypeDependent() &&
Douglas Gregor2ade35e2010-06-16 00:17:44 +00001985 Expr->getType()->isIntegerType() && !Expr->getType()->isEnumeralType())
Anders Carlssonbbf306b2009-08-28 15:55:56 +00001986 return !InOverloadResolution;
1987
Douglas Gregorce940492009-09-25 04:25:58 +00001988 return Expr->isNullPointerConstant(Context,
1989 InOverloadResolution? Expr::NPC_ValueDependentIsNotNull
1990 : Expr::NPC_ValueDependentIsNull);
Anders Carlssonbbf306b2009-08-28 15:55:56 +00001991}
Mike Stump1eb44332009-09-09 15:08:12 +00001992
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00001993/// IsPointerConversion - Determines whether the conversion of the
1994/// expression From, which has the (possibly adjusted) type FromType,
1995/// can be converted to the type ToType via a pointer conversion (C++
1996/// 4.10). If so, returns true and places the converted type (that
1997/// might differ from ToType in its cv-qualifiers at some level) into
1998/// ConvertedType.
Douglas Gregor071f2ae2008-11-27 00:15:41 +00001999///
Douglas Gregor7ca09762008-11-27 01:19:21 +00002000/// This routine also supports conversions to and from block pointers
2001/// and conversions with Objective-C's 'id', 'id<protocols...>', and
2002/// pointers to interfaces. FIXME: Once we've determined the
2003/// appropriate overloading rules for Objective-C, we may want to
2004/// split the Objective-C checks into a different routine; however,
2005/// GCC seems to consider all of these conversions to be pointer
Douglas Gregor45920e82008-12-19 17:40:08 +00002006/// conversions, so for now they live here. IncompatibleObjC will be
2007/// set if the conversion is an allowed Objective-C conversion that
2008/// should result in a warning.
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00002009bool Sema::IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
Anders Carlsson08972922009-08-28 15:33:32 +00002010 bool InOverloadResolution,
Douglas Gregor45920e82008-12-19 17:40:08 +00002011 QualType& ConvertedType,
Mike Stump1eb44332009-09-09 15:08:12 +00002012 bool &IncompatibleObjC) {
Douglas Gregor45920e82008-12-19 17:40:08 +00002013 IncompatibleObjC = false;
Chandler Carruth6df868e2010-12-12 08:17:55 +00002014 if (isObjCPointerConversion(FromType, ToType, ConvertedType,
2015 IncompatibleObjC))
Douglas Gregorc7887512008-12-19 19:13:09 +00002016 return true;
Douglas Gregor45920e82008-12-19 17:40:08 +00002017
Mike Stump1eb44332009-09-09 15:08:12 +00002018 // Conversion from a null pointer constant to any Objective-C pointer type.
2019 if (ToType->isObjCObjectPointerType() &&
Anders Carlssonbbf306b2009-08-28 15:55:56 +00002020 isNullPointerConstantForConversion(From, InOverloadResolution, Context)) {
Douglas Gregor27b09ac2008-12-22 20:51:52 +00002021 ConvertedType = ToType;
2022 return true;
2023 }
2024
Douglas Gregor071f2ae2008-11-27 00:15:41 +00002025 // Blocks: Block pointers can be converted to void*.
2026 if (FromType->isBlockPointerType() && ToType->isPointerType() &&
Ted Kremenek6217b802009-07-29 21:53:49 +00002027 ToType->getAs<PointerType>()->getPointeeType()->isVoidType()) {
Douglas Gregor071f2ae2008-11-27 00:15:41 +00002028 ConvertedType = ToType;
2029 return true;
2030 }
2031 // Blocks: A null pointer constant can be converted to a block
2032 // pointer type.
Mike Stump1eb44332009-09-09 15:08:12 +00002033 if (ToType->isBlockPointerType() &&
Anders Carlssonbbf306b2009-08-28 15:55:56 +00002034 isNullPointerConstantForConversion(From, InOverloadResolution, Context)) {
Douglas Gregor071f2ae2008-11-27 00:15:41 +00002035 ConvertedType = ToType;
2036 return true;
2037 }
2038
Sebastian Redl6e8ed162009-05-10 18:38:11 +00002039 // If the left-hand-side is nullptr_t, the right side can be a null
2040 // pointer constant.
Mike Stump1eb44332009-09-09 15:08:12 +00002041 if (ToType->isNullPtrType() &&
Anders Carlssonbbf306b2009-08-28 15:55:56 +00002042 isNullPointerConstantForConversion(From, InOverloadResolution, Context)) {
Sebastian Redl6e8ed162009-05-10 18:38:11 +00002043 ConvertedType = ToType;
2044 return true;
2045 }
2046
Ted Kremenek6217b802009-07-29 21:53:49 +00002047 const PointerType* ToTypePtr = ToType->getAs<PointerType>();
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00002048 if (!ToTypePtr)
2049 return false;
2050
2051 // A null pointer constant can be converted to a pointer type (C++ 4.10p1).
Anders Carlssonbbf306b2009-08-28 15:55:56 +00002052 if (isNullPointerConstantForConversion(From, InOverloadResolution, Context)) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00002053 ConvertedType = ToType;
2054 return true;
2055 }
Sebastian Redl07779722008-10-31 14:43:28 +00002056
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002057 // Beyond this point, both types need to be pointers
Fariborz Jahanianadcfab12009-12-16 23:13:33 +00002058 // , including objective-c pointers.
2059 QualType ToPointeeType = ToTypePtr->getPointeeType();
John McCallf85e1932011-06-15 23:02:42 +00002060 if (FromType->isObjCObjectPointerType() && ToPointeeType->isVoidType() &&
David Blaikie4e4d0842012-03-11 07:00:24 +00002061 !getLangOpts().ObjCAutoRefCount) {
Douglas Gregorda80f742010-12-01 21:43:58 +00002062 ConvertedType = BuildSimilarlyQualifiedPointerType(
2063 FromType->getAs<ObjCObjectPointerType>(),
2064 ToPointeeType,
Fariborz Jahanianadcfab12009-12-16 23:13:33 +00002065 ToType, Context);
2066 return true;
Fariborz Jahanianadcfab12009-12-16 23:13:33 +00002067 }
Ted Kremenek6217b802009-07-29 21:53:49 +00002068 const PointerType *FromTypePtr = FromType->getAs<PointerType>();
Douglas Gregorcb7de522008-11-26 23:31:11 +00002069 if (!FromTypePtr)
2070 return false;
2071
2072 QualType FromPointeeType = FromTypePtr->getPointeeType();
Douglas Gregorcb7de522008-11-26 23:31:11 +00002073
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002074 // If the unqualified pointee types are the same, this can't be a
Douglas Gregor4e938f57b2010-08-18 21:25:30 +00002075 // pointer conversion, so don't do all of the work below.
2076 if (Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType))
2077 return false;
2078
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00002079 // An rvalue of type "pointer to cv T," where T is an object type,
2080 // can be converted to an rvalue of type "pointer to cv void" (C++
2081 // 4.10p2).
Eli Friedman13578692010-08-05 02:49:48 +00002082 if (FromPointeeType->isIncompleteOrObjectType() &&
2083 ToPointeeType->isVoidType()) {
Mike Stump1eb44332009-09-09 15:08:12 +00002084 ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
Douglas Gregorbf408182008-11-27 00:52:49 +00002085 ToPointeeType,
John McCallf85e1932011-06-15 23:02:42 +00002086 ToType, Context,
2087 /*StripObjCLifetime=*/true);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00002088 return true;
2089 }
2090
Francois Picheta8ef3ac2011-05-08 22:52:41 +00002091 // MSVC allows implicit function to void* type conversion.
David Blaikie4e4d0842012-03-11 07:00:24 +00002092 if (getLangOpts().MicrosoftExt && FromPointeeType->isFunctionType() &&
Francois Picheta8ef3ac2011-05-08 22:52:41 +00002093 ToPointeeType->isVoidType()) {
2094 ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
2095 ToPointeeType,
2096 ToType, Context);
2097 return true;
2098 }
2099
Douglas Gregorf9201e02009-02-11 23:02:49 +00002100 // When we're overloading in C, we allow a special kind of pointer
2101 // conversion for compatible-but-not-identical pointee types.
David Blaikie4e4d0842012-03-11 07:00:24 +00002102 if (!getLangOpts().CPlusPlus &&
Douglas Gregorf9201e02009-02-11 23:02:49 +00002103 Context.typesAreCompatible(FromPointeeType, ToPointeeType)) {
Mike Stump1eb44332009-09-09 15:08:12 +00002104 ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
Douglas Gregorf9201e02009-02-11 23:02:49 +00002105 ToPointeeType,
Mike Stump1eb44332009-09-09 15:08:12 +00002106 ToType, Context);
Douglas Gregorf9201e02009-02-11 23:02:49 +00002107 return true;
2108 }
2109
Douglas Gregorbc0805a2008-10-23 00:40:37 +00002110 // C++ [conv.ptr]p3:
Mike Stump1eb44332009-09-09 15:08:12 +00002111 //
Douglas Gregorbc0805a2008-10-23 00:40:37 +00002112 // An rvalue of type "pointer to cv D," where D is a class type,
2113 // can be converted to an rvalue of type "pointer to cv B," where
2114 // B is a base class (clause 10) of D. If B is an inaccessible
2115 // (clause 11) or ambiguous (10.2) base class of D, a program that
2116 // necessitates this conversion is ill-formed. The result of the
2117 // conversion is a pointer to the base class sub-object of the
2118 // derived class object. The null pointer value is converted to
2119 // the null pointer value of the destination type.
2120 //
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002121 // Note that we do not check for ambiguity or inaccessibility
2122 // here. That is handled by CheckPointerConversion.
David Blaikie4e4d0842012-03-11 07:00:24 +00002123 if (getLangOpts().CPlusPlus &&
Douglas Gregorf9201e02009-02-11 23:02:49 +00002124 FromPointeeType->isRecordType() && ToPointeeType->isRecordType() &&
Douglas Gregorbf1764c2010-02-22 17:06:41 +00002125 !Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
Douglas Gregord10099e2012-05-04 16:32:21 +00002126 !RequireCompleteType(From->getLocStart(), FromPointeeType, 0) &&
Douglas Gregorcb7de522008-11-26 23:31:11 +00002127 IsDerivedFrom(FromPointeeType, ToPointeeType)) {
Mike Stump1eb44332009-09-09 15:08:12 +00002128 ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
Douglas Gregorbf408182008-11-27 00:52:49 +00002129 ToPointeeType,
Douglas Gregorcb7de522008-11-26 23:31:11 +00002130 ToType, Context);
2131 return true;
2132 }
Douglas Gregorbc0805a2008-10-23 00:40:37 +00002133
Fariborz Jahanian5da3c082011-04-14 20:33:36 +00002134 if (FromPointeeType->isVectorType() && ToPointeeType->isVectorType() &&
2135 Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) {
2136 ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
2137 ToPointeeType,
2138 ToType, Context);
2139 return true;
2140 }
2141
Douglas Gregorc7887512008-12-19 19:13:09 +00002142 return false;
2143}
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002144
2145/// \brief Adopt the given qualifiers for the given type.
2146static QualType AdoptQualifiers(ASTContext &Context, QualType T, Qualifiers Qs){
2147 Qualifiers TQs = T.getQualifiers();
2148
2149 // Check whether qualifiers already match.
2150 if (TQs == Qs)
2151 return T;
2152
2153 if (Qs.compatiblyIncludes(TQs))
2154 return Context.getQualifiedType(T, Qs);
2155
2156 return Context.getQualifiedType(T.getUnqualifiedType(), Qs);
2157}
Douglas Gregorc7887512008-12-19 19:13:09 +00002158
2159/// isObjCPointerConversion - Determines whether this is an
2160/// Objective-C pointer conversion. Subroutine of IsPointerConversion,
2161/// with the same arguments and return values.
Mike Stump1eb44332009-09-09 15:08:12 +00002162bool Sema::isObjCPointerConversion(QualType FromType, QualType ToType,
Douglas Gregorc7887512008-12-19 19:13:09 +00002163 QualType& ConvertedType,
2164 bool &IncompatibleObjC) {
David Blaikie4e4d0842012-03-11 07:00:24 +00002165 if (!getLangOpts().ObjC1)
Douglas Gregorc7887512008-12-19 19:13:09 +00002166 return false;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002167
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002168 // The set of qualifiers on the type we're converting from.
2169 Qualifiers FromQualifiers = FromType.getQualifiers();
2170
Steve Naroff14108da2009-07-10 23:34:53 +00002171 // First, we handle all conversions on ObjC object pointer types.
Chandler Carruth6df868e2010-12-12 08:17:55 +00002172 const ObjCObjectPointerType* ToObjCPtr =
2173 ToType->getAs<ObjCObjectPointerType>();
Mike Stump1eb44332009-09-09 15:08:12 +00002174 const ObjCObjectPointerType *FromObjCPtr =
John McCall183700f2009-09-21 23:43:11 +00002175 FromType->getAs<ObjCObjectPointerType>();
Douglas Gregorc7887512008-12-19 19:13:09 +00002176
Steve Naroff14108da2009-07-10 23:34:53 +00002177 if (ToObjCPtr && FromObjCPtr) {
Douglas Gregorda80f742010-12-01 21:43:58 +00002178 // If the pointee types are the same (ignoring qualifications),
2179 // then this is not a pointer conversion.
2180 if (Context.hasSameUnqualifiedType(ToObjCPtr->getPointeeType(),
2181 FromObjCPtr->getPointeeType()))
2182 return false;
2183
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002184 // Check for compatible
Steve Naroffde2e22d2009-07-15 18:40:39 +00002185 // Objective C++: We're able to convert between "id" or "Class" and a
Steve Naroff14108da2009-07-10 23:34:53 +00002186 // pointer to any interface (in both directions).
Steve Naroffde2e22d2009-07-15 18:40:39 +00002187 if (ToObjCPtr->isObjCBuiltinType() && FromObjCPtr->isObjCBuiltinType()) {
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002188 ConvertedType = AdoptQualifiers(Context, ToType, FromQualifiers);
Steve Naroff14108da2009-07-10 23:34:53 +00002189 return true;
2190 }
2191 // Conversions with Objective-C's id<...>.
Mike Stump1eb44332009-09-09 15:08:12 +00002192 if ((FromObjCPtr->isObjCQualifiedIdType() ||
Steve Naroff14108da2009-07-10 23:34:53 +00002193 ToObjCPtr->isObjCQualifiedIdType()) &&
Mike Stump1eb44332009-09-09 15:08:12 +00002194 Context.ObjCQualifiedIdTypesAreCompatible(ToType, FromType,
Steve Naroff4084c302009-07-23 01:01:38 +00002195 /*compare=*/false)) {
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002196 ConvertedType = AdoptQualifiers(Context, ToType, FromQualifiers);
Steve Naroff14108da2009-07-10 23:34:53 +00002197 return true;
2198 }
2199 // Objective C++: We're able to convert from a pointer to an
2200 // interface to a pointer to a different interface.
2201 if (Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
Fariborz Jahanianee9ca692010-03-15 18:36:00 +00002202 const ObjCInterfaceType* LHS = ToObjCPtr->getInterfaceType();
2203 const ObjCInterfaceType* RHS = FromObjCPtr->getInterfaceType();
David Blaikie4e4d0842012-03-11 07:00:24 +00002204 if (getLangOpts().CPlusPlus && LHS && RHS &&
Fariborz Jahanianee9ca692010-03-15 18:36:00 +00002205 !ToObjCPtr->getPointeeType().isAtLeastAsQualifiedAs(
2206 FromObjCPtr->getPointeeType()))
2207 return false;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002208 ConvertedType = BuildSimilarlyQualifiedPointerType(FromObjCPtr,
Douglas Gregorda80f742010-12-01 21:43:58 +00002209 ToObjCPtr->getPointeeType(),
2210 ToType, Context);
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002211 ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers);
Steve Naroff14108da2009-07-10 23:34:53 +00002212 return true;
2213 }
2214
2215 if (Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) {
2216 // Okay: this is some kind of implicit downcast of Objective-C
2217 // interfaces, which is permitted. However, we're going to
2218 // complain about it.
2219 IncompatibleObjC = true;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002220 ConvertedType = BuildSimilarlyQualifiedPointerType(FromObjCPtr,
Douglas Gregorda80f742010-12-01 21:43:58 +00002221 ToObjCPtr->getPointeeType(),
2222 ToType, Context);
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002223 ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers);
Steve Naroff14108da2009-07-10 23:34:53 +00002224 return true;
2225 }
Mike Stump1eb44332009-09-09 15:08:12 +00002226 }
Steve Naroff14108da2009-07-10 23:34:53 +00002227 // Beyond this point, both types need to be C pointers or block pointers.
Douglas Gregor2a7e58d2008-12-23 00:53:59 +00002228 QualType ToPointeeType;
Ted Kremenek6217b802009-07-29 21:53:49 +00002229 if (const PointerType *ToCPtr = ToType->getAs<PointerType>())
Steve Naroff14108da2009-07-10 23:34:53 +00002230 ToPointeeType = ToCPtr->getPointeeType();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002231 else if (const BlockPointerType *ToBlockPtr =
Fariborz Jahanianb351a7d2010-01-20 22:54:38 +00002232 ToType->getAs<BlockPointerType>()) {
Fariborz Jahanian48168392010-01-21 00:08:17 +00002233 // Objective C++: We're able to convert from a pointer to any object
Fariborz Jahanianb351a7d2010-01-20 22:54:38 +00002234 // to a block pointer type.
2235 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002236 ConvertedType = AdoptQualifiers(Context, ToType, FromQualifiers);
Fariborz Jahanianb351a7d2010-01-20 22:54:38 +00002237 return true;
2238 }
Douglas Gregor2a7e58d2008-12-23 00:53:59 +00002239 ToPointeeType = ToBlockPtr->getPointeeType();
Fariborz Jahanianb351a7d2010-01-20 22:54:38 +00002240 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002241 else if (FromType->getAs<BlockPointerType>() &&
Fariborz Jahanianf7c43fd2010-01-21 00:05:09 +00002242 ToObjCPtr && ToObjCPtr->isObjCBuiltinType()) {
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002243 // Objective C++: We're able to convert from a block pointer type to a
Fariborz Jahanian48168392010-01-21 00:08:17 +00002244 // pointer to any object.
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002245 ConvertedType = AdoptQualifiers(Context, ToType, FromQualifiers);
Fariborz Jahanianf7c43fd2010-01-21 00:05:09 +00002246 return true;
2247 }
Douglas Gregor2a7e58d2008-12-23 00:53:59 +00002248 else
Douglas Gregorc7887512008-12-19 19:13:09 +00002249 return false;
2250
Douglas Gregor2a7e58d2008-12-23 00:53:59 +00002251 QualType FromPointeeType;
Ted Kremenek6217b802009-07-29 21:53:49 +00002252 if (const PointerType *FromCPtr = FromType->getAs<PointerType>())
Steve Naroff14108da2009-07-10 23:34:53 +00002253 FromPointeeType = FromCPtr->getPointeeType();
Chandler Carruth6df868e2010-12-12 08:17:55 +00002254 else if (const BlockPointerType *FromBlockPtr =
2255 FromType->getAs<BlockPointerType>())
Douglas Gregor2a7e58d2008-12-23 00:53:59 +00002256 FromPointeeType = FromBlockPtr->getPointeeType();
2257 else
Douglas Gregorc7887512008-12-19 19:13:09 +00002258 return false;
2259
Douglas Gregorc7887512008-12-19 19:13:09 +00002260 // If we have pointers to pointers, recursively check whether this
2261 // is an Objective-C conversion.
2262 if (FromPointeeType->isPointerType() && ToPointeeType->isPointerType() &&
2263 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
2264 IncompatibleObjC)) {
2265 // We always complain about this conversion.
2266 IncompatibleObjC = true;
Douglas Gregorda80f742010-12-01 21:43:58 +00002267 ConvertedType = Context.getPointerType(ConvertedType);
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002268 ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers);
Douglas Gregorc7887512008-12-19 19:13:09 +00002269 return true;
2270 }
Fariborz Jahanian83b7b312010-01-18 22:59:22 +00002271 // Allow conversion of pointee being objective-c pointer to another one;
2272 // as in I* to id.
2273 if (FromPointeeType->getAs<ObjCObjectPointerType>() &&
2274 ToPointeeType->getAs<ObjCObjectPointerType>() &&
2275 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
2276 IncompatibleObjC)) {
John McCallf85e1932011-06-15 23:02:42 +00002277
Douglas Gregorda80f742010-12-01 21:43:58 +00002278 ConvertedType = Context.getPointerType(ConvertedType);
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002279 ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers);
Fariborz Jahanian83b7b312010-01-18 22:59:22 +00002280 return true;
2281 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002282
Douglas Gregor2a7e58d2008-12-23 00:53:59 +00002283 // If we have pointers to functions or blocks, check whether the only
Douglas Gregorc7887512008-12-19 19:13:09 +00002284 // differences in the argument and result types are in Objective-C
2285 // pointer conversions. If so, we permit the conversion (but
2286 // complain about it).
Mike Stump1eb44332009-09-09 15:08:12 +00002287 const FunctionProtoType *FromFunctionType
John McCall183700f2009-09-21 23:43:11 +00002288 = FromPointeeType->getAs<FunctionProtoType>();
Douglas Gregor72564e72009-02-26 23:50:07 +00002289 const FunctionProtoType *ToFunctionType
John McCall183700f2009-09-21 23:43:11 +00002290 = ToPointeeType->getAs<FunctionProtoType>();
Douglas Gregorc7887512008-12-19 19:13:09 +00002291 if (FromFunctionType && ToFunctionType) {
2292 // If the function types are exactly the same, this isn't an
2293 // Objective-C pointer conversion.
2294 if (Context.getCanonicalType(FromPointeeType)
2295 == Context.getCanonicalType(ToPointeeType))
2296 return false;
2297
2298 // Perform the quick checks that will tell us whether these
2299 // function types are obviously different.
2300 if (FromFunctionType->getNumArgs() != ToFunctionType->getNumArgs() ||
2301 FromFunctionType->isVariadic() != ToFunctionType->isVariadic() ||
2302 FromFunctionType->getTypeQuals() != ToFunctionType->getTypeQuals())
2303 return false;
2304
2305 bool HasObjCConversion = false;
2306 if (Context.getCanonicalType(FromFunctionType->getResultType())
2307 == Context.getCanonicalType(ToFunctionType->getResultType())) {
2308 // Okay, the types match exactly. Nothing to do.
2309 } else if (isObjCPointerConversion(FromFunctionType->getResultType(),
2310 ToFunctionType->getResultType(),
2311 ConvertedType, IncompatibleObjC)) {
2312 // Okay, we have an Objective-C pointer conversion.
2313 HasObjCConversion = true;
2314 } else {
2315 // Function types are too different. Abort.
2316 return false;
2317 }
Mike Stump1eb44332009-09-09 15:08:12 +00002318
Douglas Gregorc7887512008-12-19 19:13:09 +00002319 // Check argument types.
2320 for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs();
2321 ArgIdx != NumArgs; ++ArgIdx) {
2322 QualType FromArgType = FromFunctionType->getArgType(ArgIdx);
2323 QualType ToArgType = ToFunctionType->getArgType(ArgIdx);
2324 if (Context.getCanonicalType(FromArgType)
2325 == Context.getCanonicalType(ToArgType)) {
2326 // Okay, the types match exactly. Nothing to do.
2327 } else if (isObjCPointerConversion(FromArgType, ToArgType,
2328 ConvertedType, IncompatibleObjC)) {
2329 // Okay, we have an Objective-C pointer conversion.
2330 HasObjCConversion = true;
2331 } else {
2332 // Argument types are too different. Abort.
2333 return false;
2334 }
2335 }
2336
2337 if (HasObjCConversion) {
2338 // We had an Objective-C conversion. Allow this pointer
2339 // conversion, but complain about it.
Douglas Gregor028ea4b2011-04-26 23:16:46 +00002340 ConvertedType = AdoptQualifiers(Context, ToType, FromQualifiers);
Douglas Gregorc7887512008-12-19 19:13:09 +00002341 IncompatibleObjC = true;
2342 return true;
2343 }
2344 }
2345
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002346 return false;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00002347}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002348
John McCallf85e1932011-06-15 23:02:42 +00002349/// \brief Determine whether this is an Objective-C writeback conversion,
2350/// used for parameter passing when performing automatic reference counting.
2351///
2352/// \param FromType The type we're converting form.
2353///
2354/// \param ToType The type we're converting to.
2355///
2356/// \param ConvertedType The type that will be produced after applying
2357/// this conversion.
2358bool Sema::isObjCWritebackConversion(QualType FromType, QualType ToType,
2359 QualType &ConvertedType) {
David Blaikie4e4d0842012-03-11 07:00:24 +00002360 if (!getLangOpts().ObjCAutoRefCount ||
John McCallf85e1932011-06-15 23:02:42 +00002361 Context.hasSameUnqualifiedType(FromType, ToType))
2362 return false;
2363
2364 // Parameter must be a pointer to __autoreleasing (with no other qualifiers).
2365 QualType ToPointee;
2366 if (const PointerType *ToPointer = ToType->getAs<PointerType>())
2367 ToPointee = ToPointer->getPointeeType();
2368 else
2369 return false;
2370
2371 Qualifiers ToQuals = ToPointee.getQualifiers();
2372 if (!ToPointee->isObjCLifetimeType() ||
2373 ToQuals.getObjCLifetime() != Qualifiers::OCL_Autoreleasing ||
John McCall200fa532012-02-08 00:46:36 +00002374 !ToQuals.withoutObjCLifetime().empty())
John McCallf85e1932011-06-15 23:02:42 +00002375 return false;
2376
2377 // Argument must be a pointer to __strong to __weak.
2378 QualType FromPointee;
2379 if (const PointerType *FromPointer = FromType->getAs<PointerType>())
2380 FromPointee = FromPointer->getPointeeType();
2381 else
2382 return false;
2383
2384 Qualifiers FromQuals = FromPointee.getQualifiers();
2385 if (!FromPointee->isObjCLifetimeType() ||
2386 (FromQuals.getObjCLifetime() != Qualifiers::OCL_Strong &&
2387 FromQuals.getObjCLifetime() != Qualifiers::OCL_Weak))
2388 return false;
2389
2390 // Make sure that we have compatible qualifiers.
2391 FromQuals.setObjCLifetime(Qualifiers::OCL_Autoreleasing);
2392 if (!ToQuals.compatiblyIncludes(FromQuals))
2393 return false;
2394
2395 // Remove qualifiers from the pointee type we're converting from; they
2396 // aren't used in the compatibility check belong, and we'll be adding back
2397 // qualifiers (with __autoreleasing) if the compatibility check succeeds.
2398 FromPointee = FromPointee.getUnqualifiedType();
2399
2400 // The unqualified form of the pointee types must be compatible.
2401 ToPointee = ToPointee.getUnqualifiedType();
2402 bool IncompatibleObjC;
2403 if (Context.typesAreCompatible(FromPointee, ToPointee))
2404 FromPointee = ToPointee;
2405 else if (!isObjCPointerConversion(FromPointee, ToPointee, FromPointee,
2406 IncompatibleObjC))
2407 return false;
2408
2409 /// \brief Construct the type we're converting to, which is a pointer to
2410 /// __autoreleasing pointee.
2411 FromPointee = Context.getQualifiedType(FromPointee, FromQuals);
2412 ConvertedType = Context.getPointerType(FromPointee);
2413 return true;
2414}
2415
Fariborz Jahaniane3c8c642011-02-12 19:07:46 +00002416bool Sema::IsBlockPointerConversion(QualType FromType, QualType ToType,
2417 QualType& ConvertedType) {
2418 QualType ToPointeeType;
2419 if (const BlockPointerType *ToBlockPtr =
2420 ToType->getAs<BlockPointerType>())
2421 ToPointeeType = ToBlockPtr->getPointeeType();
2422 else
2423 return false;
2424
2425 QualType FromPointeeType;
2426 if (const BlockPointerType *FromBlockPtr =
2427 FromType->getAs<BlockPointerType>())
2428 FromPointeeType = FromBlockPtr->getPointeeType();
2429 else
2430 return false;
2431 // We have pointer to blocks, check whether the only
2432 // differences in the argument and result types are in Objective-C
2433 // pointer conversions. If so, we permit the conversion.
2434
2435 const FunctionProtoType *FromFunctionType
2436 = FromPointeeType->getAs<FunctionProtoType>();
2437 const FunctionProtoType *ToFunctionType
2438 = ToPointeeType->getAs<FunctionProtoType>();
2439
Fariborz Jahanian569bd8f2011-02-13 20:01:48 +00002440 if (!FromFunctionType || !ToFunctionType)
2441 return false;
Fariborz Jahaniane3c8c642011-02-12 19:07:46 +00002442
Fariborz Jahanian569bd8f2011-02-13 20:01:48 +00002443 if (Context.hasSameType(FromPointeeType, ToPointeeType))
Fariborz Jahaniane3c8c642011-02-12 19:07:46 +00002444 return true;
Fariborz Jahanian569bd8f2011-02-13 20:01:48 +00002445
2446 // Perform the quick checks that will tell us whether these
2447 // function types are obviously different.
2448 if (FromFunctionType->getNumArgs() != ToFunctionType->getNumArgs() ||
2449 FromFunctionType->isVariadic() != ToFunctionType->isVariadic())
2450 return false;
2451
2452 FunctionType::ExtInfo FromEInfo = FromFunctionType->getExtInfo();
2453 FunctionType::ExtInfo ToEInfo = ToFunctionType->getExtInfo();
2454 if (FromEInfo != ToEInfo)
2455 return false;
2456
2457 bool IncompatibleObjC = false;
Fariborz Jahanian462dae52011-02-13 20:11:42 +00002458 if (Context.hasSameType(FromFunctionType->getResultType(),
2459 ToFunctionType->getResultType())) {
Fariborz Jahanian569bd8f2011-02-13 20:01:48 +00002460 // Okay, the types match exactly. Nothing to do.
2461 } else {
2462 QualType RHS = FromFunctionType->getResultType();
2463 QualType LHS = ToFunctionType->getResultType();
David Blaikie4e4d0842012-03-11 07:00:24 +00002464 if ((!getLangOpts().CPlusPlus || !RHS->isRecordType()) &&
Fariborz Jahanian569bd8f2011-02-13 20:01:48 +00002465 !RHS.hasQualifiers() && LHS.hasQualifiers())
2466 LHS = LHS.getUnqualifiedType();
2467
2468 if (Context.hasSameType(RHS,LHS)) {
2469 // OK exact match.
2470 } else if (isObjCPointerConversion(RHS, LHS,
2471 ConvertedType, IncompatibleObjC)) {
2472 if (IncompatibleObjC)
2473 return false;
2474 // Okay, we have an Objective-C pointer conversion.
2475 }
2476 else
2477 return false;
2478 }
2479
2480 // Check argument types.
2481 for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs();
2482 ArgIdx != NumArgs; ++ArgIdx) {
2483 IncompatibleObjC = false;
2484 QualType FromArgType = FromFunctionType->getArgType(ArgIdx);
2485 QualType ToArgType = ToFunctionType->getArgType(ArgIdx);
2486 if (Context.hasSameType(FromArgType, ToArgType)) {
2487 // Okay, the types match exactly. Nothing to do.
2488 } else if (isObjCPointerConversion(ToArgType, FromArgType,
2489 ConvertedType, IncompatibleObjC)) {
2490 if (IncompatibleObjC)
2491 return false;
2492 // Okay, we have an Objective-C pointer conversion.
2493 } else
2494 // Argument types are too different. Abort.
2495 return false;
2496 }
Fariborz Jahanian78213e42011-09-28 21:52:05 +00002497 if (LangOpts.ObjCAutoRefCount &&
2498 !Context.FunctionTypesMatchOnNSConsumedAttrs(FromFunctionType,
2499 ToFunctionType))
2500 return false;
Fariborz Jahanianf9d95272011-09-28 20:22:05 +00002501
Fariborz Jahanian569bd8f2011-02-13 20:01:48 +00002502 ConvertedType = ToType;
2503 return true;
Fariborz Jahaniane3c8c642011-02-12 19:07:46 +00002504}
2505
Richard Trieu6efd4c52011-11-23 22:32:32 +00002506enum {
2507 ft_default,
2508 ft_different_class,
2509 ft_parameter_arity,
2510 ft_parameter_mismatch,
2511 ft_return_type,
2512 ft_qualifer_mismatch
2513};
2514
2515/// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
2516/// function types. Catches different number of parameter, mismatch in
2517/// parameter types, and different return types.
2518void Sema::HandleFunctionTypeMismatch(PartialDiagnostic &PDiag,
2519 QualType FromType, QualType ToType) {
Richard Trieua6dc7ef2011-12-13 23:19:45 +00002520 // If either type is not valid, include no extra info.
2521 if (FromType.isNull() || ToType.isNull()) {
2522 PDiag << ft_default;
2523 return;
2524 }
2525
Richard Trieu6efd4c52011-11-23 22:32:32 +00002526 // Get the function type from the pointers.
2527 if (FromType->isMemberPointerType() && ToType->isMemberPointerType()) {
2528 const MemberPointerType *FromMember = FromType->getAs<MemberPointerType>(),
2529 *ToMember = ToType->getAs<MemberPointerType>();
2530 if (FromMember->getClass() != ToMember->getClass()) {
2531 PDiag << ft_different_class << QualType(ToMember->getClass(), 0)
2532 << QualType(FromMember->getClass(), 0);
2533 return;
2534 }
2535 FromType = FromMember->getPointeeType();
2536 ToType = ToMember->getPointeeType();
Richard Trieu6efd4c52011-11-23 22:32:32 +00002537 }
2538
Richard Trieua6dc7ef2011-12-13 23:19:45 +00002539 if (FromType->isPointerType())
2540 FromType = FromType->getPointeeType();
2541 if (ToType->isPointerType())
2542 ToType = ToType->getPointeeType();
2543
2544 // Remove references.
Richard Trieu6efd4c52011-11-23 22:32:32 +00002545 FromType = FromType.getNonReferenceType();
2546 ToType = ToType.getNonReferenceType();
2547
Richard Trieu6efd4c52011-11-23 22:32:32 +00002548 // Don't print extra info for non-specialized template functions.
2549 if (FromType->isInstantiationDependentType() &&
2550 !FromType->getAs<TemplateSpecializationType>()) {
2551 PDiag << ft_default;
2552 return;
2553 }
2554
Richard Trieua6dc7ef2011-12-13 23:19:45 +00002555 // No extra info for same types.
2556 if (Context.hasSameType(FromType, ToType)) {
2557 PDiag << ft_default;
2558 return;
2559 }
2560
Richard Trieu6efd4c52011-11-23 22:32:32 +00002561 const FunctionProtoType *FromFunction = FromType->getAs<FunctionProtoType>(),
2562 *ToFunction = ToType->getAs<FunctionProtoType>();
2563
2564 // Both types need to be function types.
2565 if (!FromFunction || !ToFunction) {
2566 PDiag << ft_default;
2567 return;
2568 }
2569
2570 if (FromFunction->getNumArgs() != ToFunction->getNumArgs()) {
2571 PDiag << ft_parameter_arity << ToFunction->getNumArgs()
2572 << FromFunction->getNumArgs();
2573 return;
2574 }
2575
2576 // Handle different parameter types.
2577 unsigned ArgPos;
2578 if (!FunctionArgTypesAreEqual(FromFunction, ToFunction, &ArgPos)) {
2579 PDiag << ft_parameter_mismatch << ArgPos + 1
2580 << ToFunction->getArgType(ArgPos)
2581 << FromFunction->getArgType(ArgPos);
2582 return;
2583 }
2584
2585 // Handle different return type.
2586 if (!Context.hasSameType(FromFunction->getResultType(),
2587 ToFunction->getResultType())) {
2588 PDiag << ft_return_type << ToFunction->getResultType()
2589 << FromFunction->getResultType();
2590 return;
2591 }
2592
2593 unsigned FromQuals = FromFunction->getTypeQuals(),
2594 ToQuals = ToFunction->getTypeQuals();
2595 if (FromQuals != ToQuals) {
2596 PDiag << ft_qualifer_mismatch << ToQuals << FromQuals;
2597 return;
2598 }
2599
2600 // Unable to find a difference, so add no extra info.
2601 PDiag << ft_default;
2602}
2603
Fariborz Jahaniand8d34412010-05-03 21:06:18 +00002604/// FunctionArgTypesAreEqual - This routine checks two function proto types
Douglas Gregordec1cc42011-12-15 17:15:07 +00002605/// for equality of their argument types. Caller has already checked that
Fariborz Jahaniand8d34412010-05-03 21:06:18 +00002606/// they have same number of arguments. This routine assumes that Objective-C
2607/// pointer types which only differ in their protocol qualifiers are equal.
Sylvestre Ledrubed28ac2012-07-23 08:59:39 +00002608/// If the parameters are different, ArgPos will have the parameter index
Richard Trieu6efd4c52011-11-23 22:32:32 +00002609/// of the first different parameter.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002610bool Sema::FunctionArgTypesAreEqual(const FunctionProtoType *OldType,
Richard Trieu6efd4c52011-11-23 22:32:32 +00002611 const FunctionProtoType *NewType,
2612 unsigned *ArgPos) {
David Blaikie4e4d0842012-03-11 07:00:24 +00002613 if (!getLangOpts().ObjC1) {
Richard Trieu6efd4c52011-11-23 22:32:32 +00002614 for (FunctionProtoType::arg_type_iterator O = OldType->arg_type_begin(),
2615 N = NewType->arg_type_begin(),
2616 E = OldType->arg_type_end(); O && (O != E); ++O, ++N) {
2617 if (!Context.hasSameType(*O, *N)) {
2618 if (ArgPos) *ArgPos = O - OldType->arg_type_begin();
2619 return false;
2620 }
2621 }
2622 return true;
2623 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002624
Fariborz Jahaniand8d34412010-05-03 21:06:18 +00002625 for (FunctionProtoType::arg_type_iterator O = OldType->arg_type_begin(),
2626 N = NewType->arg_type_begin(),
2627 E = OldType->arg_type_end(); O && (O != E); ++O, ++N) {
2628 QualType ToType = (*O);
2629 QualType FromType = (*N);
Richard Trieu6efd4c52011-11-23 22:32:32 +00002630 if (!Context.hasSameType(ToType, FromType)) {
Fariborz Jahaniand8d34412010-05-03 21:06:18 +00002631 if (const PointerType *PTTo = ToType->getAs<PointerType>()) {
2632 if (const PointerType *PTFr = FromType->getAs<PointerType>())
Chandler Carruth0ee93de2010-05-06 00:15:06 +00002633 if ((PTTo->getPointeeType()->isObjCQualifiedIdType() &&
2634 PTFr->getPointeeType()->isObjCQualifiedIdType()) ||
2635 (PTTo->getPointeeType()->isObjCQualifiedClassType() &&
2636 PTFr->getPointeeType()->isObjCQualifiedClassType()))
Fariborz Jahaniand8d34412010-05-03 21:06:18 +00002637 continue;
2638 }
John McCallc12c5bb2010-05-15 11:32:37 +00002639 else if (const ObjCObjectPointerType *PTTo =
2640 ToType->getAs<ObjCObjectPointerType>()) {
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002641 if (const ObjCObjectPointerType *PTFr =
John McCallc12c5bb2010-05-15 11:32:37 +00002642 FromType->getAs<ObjCObjectPointerType>())
Douglas Gregordec1cc42011-12-15 17:15:07 +00002643 if (Context.hasSameUnqualifiedType(
2644 PTTo->getObjectType()->getBaseType(),
2645 PTFr->getObjectType()->getBaseType()))
John McCallc12c5bb2010-05-15 11:32:37 +00002646 continue;
Fariborz Jahaniand8d34412010-05-03 21:06:18 +00002647 }
Richard Trieu6efd4c52011-11-23 22:32:32 +00002648 if (ArgPos) *ArgPos = O - OldType->arg_type_begin();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002649 return false;
Fariborz Jahaniand8d34412010-05-03 21:06:18 +00002650 }
2651 }
2652 return true;
2653}
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00002654
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002655/// CheckPointerConversion - Check the pointer conversion from the
2656/// expression From to the type ToType. This routine checks for
Sebastian Redl9cc11e72009-07-25 15:41:38 +00002657/// ambiguous or inaccessible derived-to-base pointer
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002658/// conversions for which IsPointerConversion has already returned
2659/// true. It returns true and produces a diagnostic if there was an
2660/// error, or returns false otherwise.
Anders Carlsson61faec12009-09-12 04:46:44 +00002661bool Sema::CheckPointerConversion(Expr *From, QualType ToType,
John McCall2de56d12010-08-25 11:45:40 +00002662 CastKind &Kind,
John McCallf871d0c2010-08-07 06:22:56 +00002663 CXXCastPath& BasePath,
Sebastian Redla82e4ae2009-11-14 21:15:49 +00002664 bool IgnoreBaseAccess) {
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002665 QualType FromType = From->getType();
Argyrios Kyrtzidisb3358722010-09-28 14:54:11 +00002666 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002667
John McCalldaa8e4e2010-11-15 09:13:47 +00002668 Kind = CK_BitCast;
2669
David Blaikie50800fc2012-08-08 17:33:31 +00002670 if (!IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() &&
2671 From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull) ==
2672 Expr::NPCK_ZeroExpression) {
2673 if (Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy))
2674 DiagRuntimeBehavior(From->getExprLoc(), From,
2675 PDiag(diag::warn_impcast_bool_to_null_pointer)
2676 << ToType << From->getSourceRange());
2677 else if (!isUnevaluatedContext())
2678 Diag(From->getExprLoc(), diag::warn_non_literal_null_pointer)
2679 << ToType << From->getSourceRange();
2680 }
John McCall1d9b3b22011-09-09 05:25:32 +00002681 if (const PointerType *ToPtrType = ToType->getAs<PointerType>()) {
2682 if (const PointerType *FromPtrType = FromType->getAs<PointerType>()) {
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002683 QualType FromPointeeType = FromPtrType->getPointeeType(),
2684 ToPointeeType = ToPtrType->getPointeeType();
Douglas Gregordda78892008-12-18 23:43:31 +00002685
Douglas Gregor5fccd362010-03-03 23:55:11 +00002686 if (FromPointeeType->isRecordType() && ToPointeeType->isRecordType() &&
2687 !Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002688 // We must have a derived-to-base conversion. Check an
2689 // ambiguous or inaccessible conversion.
Anders Carlsson61faec12009-09-12 04:46:44 +00002690 if (CheckDerivedToBaseConversion(FromPointeeType, ToPointeeType,
2691 From->getExprLoc(),
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00002692 From->getSourceRange(), &BasePath,
Sebastian Redla82e4ae2009-11-14 21:15:49 +00002693 IgnoreBaseAccess))
Anders Carlsson61faec12009-09-12 04:46:44 +00002694 return true;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002695
Anders Carlsson61faec12009-09-12 04:46:44 +00002696 // The conversion was successful.
John McCall2de56d12010-08-25 11:45:40 +00002697 Kind = CK_DerivedToBase;
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002698 }
2699 }
John McCall1d9b3b22011-09-09 05:25:32 +00002700 } else if (const ObjCObjectPointerType *ToPtrType =
2701 ToType->getAs<ObjCObjectPointerType>()) {
2702 if (const ObjCObjectPointerType *FromPtrType =
2703 FromType->getAs<ObjCObjectPointerType>()) {
Steve Naroff14108da2009-07-10 23:34:53 +00002704 // Objective-C++ conversions are always okay.
2705 // FIXME: We should have a different class of conversions for the
2706 // Objective-C++ implicit conversions.
Steve Naroffde2e22d2009-07-15 18:40:39 +00002707 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
Steve Naroff14108da2009-07-10 23:34:53 +00002708 return false;
John McCall1d9b3b22011-09-09 05:25:32 +00002709 } else if (FromType->isBlockPointerType()) {
2710 Kind = CK_BlockPointerToObjCPointerCast;
2711 } else {
2712 Kind = CK_CPointerToObjCPointerCast;
John McCalldaa8e4e2010-11-15 09:13:47 +00002713 }
John McCall1d9b3b22011-09-09 05:25:32 +00002714 } else if (ToType->isBlockPointerType()) {
2715 if (!FromType->isBlockPointerType())
2716 Kind = CK_AnyPointerToBlockPointerCast;
Steve Naroff14108da2009-07-10 23:34:53 +00002717 }
John McCalldaa8e4e2010-11-15 09:13:47 +00002718
2719 // We shouldn't fall into this case unless it's valid for other
2720 // reasons.
2721 if (From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull))
2722 Kind = CK_NullToPointer;
2723
Douglas Gregor94b1dd22008-10-24 04:54:22 +00002724 return false;
2725}
2726
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002727/// IsMemberPointerConversion - Determines whether the conversion of the
2728/// expression From, which has the (possibly adjusted) type FromType, can be
2729/// converted to the type ToType via a member pointer conversion (C++ 4.11).
2730/// If so, returns true and places the converted type (that might differ from
2731/// ToType in its cv-qualifiers at some level) into ConvertedType.
2732bool Sema::IsMemberPointerConversion(Expr *From, QualType FromType,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002733 QualType ToType,
Douglas Gregorce940492009-09-25 04:25:58 +00002734 bool InOverloadResolution,
2735 QualType &ConvertedType) {
Ted Kremenek6217b802009-07-29 21:53:49 +00002736 const MemberPointerType *ToTypePtr = ToType->getAs<MemberPointerType>();
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002737 if (!ToTypePtr)
2738 return false;
2739
2740 // A null pointer constant can be converted to a member pointer (C++ 4.11p1)
Douglas Gregorce940492009-09-25 04:25:58 +00002741 if (From->isNullPointerConstant(Context,
2742 InOverloadResolution? Expr::NPC_ValueDependentIsNotNull
2743 : Expr::NPC_ValueDependentIsNull)) {
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002744 ConvertedType = ToType;
2745 return true;
2746 }
2747
2748 // Otherwise, both types have to be member pointers.
Ted Kremenek6217b802009-07-29 21:53:49 +00002749 const MemberPointerType *FromTypePtr = FromType->getAs<MemberPointerType>();
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002750 if (!FromTypePtr)
2751 return false;
2752
2753 // A pointer to member of B can be converted to a pointer to member of D,
2754 // where D is derived from B (C++ 4.11p2).
2755 QualType FromClass(FromTypePtr->getClass(), 0);
2756 QualType ToClass(ToTypePtr->getClass(), 0);
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002757
Douglas Gregorcfddf7b2010-12-21 21:40:41 +00002758 if (!Context.hasSameUnqualifiedType(FromClass, ToClass) &&
Douglas Gregord10099e2012-05-04 16:32:21 +00002759 !RequireCompleteType(From->getLocStart(), ToClass, 0) &&
Douglas Gregorcfddf7b2010-12-21 21:40:41 +00002760 IsDerivedFrom(ToClass, FromClass)) {
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002761 ConvertedType = Context.getMemberPointerType(FromTypePtr->getPointeeType(),
2762 ToClass.getTypePtr());
2763 return true;
2764 }
2765
2766 return false;
2767}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002768
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002769/// CheckMemberPointerConversion - Check the member pointer conversion from the
2770/// expression From to the type ToType. This routine checks for ambiguous or
John McCall6b2accb2010-02-10 09:31:12 +00002771/// virtual or inaccessible base-to-derived member pointer conversions
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002772/// for which IsMemberPointerConversion has already returned true. It returns
2773/// true and produces a diagnostic if there was an error, or returns false
2774/// otherwise.
Mike Stump1eb44332009-09-09 15:08:12 +00002775bool Sema::CheckMemberPointerConversion(Expr *From, QualType ToType,
John McCall2de56d12010-08-25 11:45:40 +00002776 CastKind &Kind,
John McCallf871d0c2010-08-07 06:22:56 +00002777 CXXCastPath &BasePath,
Sebastian Redla82e4ae2009-11-14 21:15:49 +00002778 bool IgnoreBaseAccess) {
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002779 QualType FromType = From->getType();
Ted Kremenek6217b802009-07-29 21:53:49 +00002780 const MemberPointerType *FromPtrType = FromType->getAs<MemberPointerType>();
Anders Carlsson27a5b9b2009-08-22 23:33:40 +00002781 if (!FromPtrType) {
2782 // This must be a null pointer to member pointer conversion
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002783 assert(From->isNullPointerConstant(Context,
Douglas Gregorce940492009-09-25 04:25:58 +00002784 Expr::NPC_ValueDependentIsNull) &&
Anders Carlsson27a5b9b2009-08-22 23:33:40 +00002785 "Expr must be null pointer constant!");
John McCall2de56d12010-08-25 11:45:40 +00002786 Kind = CK_NullToMemberPointer;
Sebastian Redl21593ac2009-01-28 18:33:18 +00002787 return false;
Anders Carlsson27a5b9b2009-08-22 23:33:40 +00002788 }
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002789
Ted Kremenek6217b802009-07-29 21:53:49 +00002790 const MemberPointerType *ToPtrType = ToType->getAs<MemberPointerType>();
Sebastian Redl21593ac2009-01-28 18:33:18 +00002791 assert(ToPtrType && "No member pointer cast has a target type "
2792 "that is not a member pointer.");
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002793
Sebastian Redl21593ac2009-01-28 18:33:18 +00002794 QualType FromClass = QualType(FromPtrType->getClass(), 0);
2795 QualType ToClass = QualType(ToPtrType->getClass(), 0);
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002796
Sebastian Redl21593ac2009-01-28 18:33:18 +00002797 // FIXME: What about dependent types?
2798 assert(FromClass->isRecordType() && "Pointer into non-class.");
2799 assert(ToClass->isRecordType() && "Pointer into non-class.");
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002800
Anders Carlssonf9d68e12010-04-24 19:36:51 +00002801 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
Douglas Gregora8f32e02009-10-06 17:59:45 +00002802 /*DetectVirtual=*/true);
Sebastian Redl21593ac2009-01-28 18:33:18 +00002803 bool DerivationOkay = IsDerivedFrom(ToClass, FromClass, Paths);
2804 assert(DerivationOkay &&
2805 "Should not have been called if derivation isn't OK.");
2806 (void)DerivationOkay;
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002807
Sebastian Redl21593ac2009-01-28 18:33:18 +00002808 if (Paths.isAmbiguous(Context.getCanonicalType(FromClass).
2809 getUnqualifiedType())) {
Sebastian Redl21593ac2009-01-28 18:33:18 +00002810 std::string PathDisplayStr = getAmbiguousPathsDisplayString(Paths);
2811 Diag(From->getExprLoc(), diag::err_ambiguous_memptr_conv)
2812 << 0 << FromClass << ToClass << PathDisplayStr << From->getSourceRange();
2813 return true;
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002814 }
Sebastian Redl21593ac2009-01-28 18:33:18 +00002815
Douglas Gregorc1efaec2009-02-28 01:32:25 +00002816 if (const RecordType *VBase = Paths.getDetectedVirtual()) {
Sebastian Redl21593ac2009-01-28 18:33:18 +00002817 Diag(From->getExprLoc(), diag::err_memptr_conv_via_virtual)
2818 << FromClass << ToClass << QualType(VBase, 0)
2819 << From->getSourceRange();
2820 return true;
2821 }
2822
John McCall6b2accb2010-02-10 09:31:12 +00002823 if (!IgnoreBaseAccess)
John McCall58e6f342010-03-16 05:22:47 +00002824 CheckBaseClassAccess(From->getExprLoc(), FromClass, ToClass,
2825 Paths.front(),
2826 diag::err_downcast_from_inaccessible_base);
John McCall6b2accb2010-02-10 09:31:12 +00002827
Anders Carlsson27a5b9b2009-08-22 23:33:40 +00002828 // Must be a base to derived member conversion.
Anders Carlssonf9d68e12010-04-24 19:36:51 +00002829 BuildBasePathArray(Paths, BasePath);
John McCall2de56d12010-08-25 11:45:40 +00002830 Kind = CK_BaseToDerivedMemberPointer;
Sebastian Redl4433aaf2009-01-25 19:43:20 +00002831 return false;
2832}
2833
Douglas Gregor98cd5992008-10-21 23:43:52 +00002834/// IsQualificationConversion - Determines whether the conversion from
2835/// an rvalue of type FromType to ToType is a qualification conversion
2836/// (C++ 4.4).
John McCallf85e1932011-06-15 23:02:42 +00002837///
2838/// \param ObjCLifetimeConversion Output parameter that will be set to indicate
2839/// when the qualification conversion involves a change in the Objective-C
2840/// object lifetime.
Mike Stump1eb44332009-09-09 15:08:12 +00002841bool
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00002842Sema::IsQualificationConversion(QualType FromType, QualType ToType,
John McCallf85e1932011-06-15 23:02:42 +00002843 bool CStyle, bool &ObjCLifetimeConversion) {
Douglas Gregor98cd5992008-10-21 23:43:52 +00002844 FromType = Context.getCanonicalType(FromType);
2845 ToType = Context.getCanonicalType(ToType);
John McCallf85e1932011-06-15 23:02:42 +00002846 ObjCLifetimeConversion = false;
2847
Douglas Gregor98cd5992008-10-21 23:43:52 +00002848 // If FromType and ToType are the same type, this is not a
2849 // qualification conversion.
Sebastian Redl22c92402010-02-03 19:36:07 +00002850 if (FromType.getUnqualifiedType() == ToType.getUnqualifiedType())
Douglas Gregor98cd5992008-10-21 23:43:52 +00002851 return false;
Sebastian Redl21593ac2009-01-28 18:33:18 +00002852
Douglas Gregor98cd5992008-10-21 23:43:52 +00002853 // (C++ 4.4p4):
2854 // A conversion can add cv-qualifiers at levels other than the first
2855 // in multi-level pointers, subject to the following rules: [...]
2856 bool PreviousToQualsIncludeConst = true;
Douglas Gregor98cd5992008-10-21 23:43:52 +00002857 bool UnwrappedAnyPointer = false;
Douglas Gregor5a57efd2010-06-09 03:53:18 +00002858 while (Context.UnwrapSimilarPointerTypes(FromType, ToType)) {
Douglas Gregor98cd5992008-10-21 23:43:52 +00002859 // Within each iteration of the loop, we check the qualifiers to
2860 // determine if this still looks like a qualification
2861 // conversion. Then, if all is well, we unwrap one more level of
Douglas Gregorf8268ae2008-10-22 17:49:05 +00002862 // pointers or pointers-to-members and do it all again
Douglas Gregor98cd5992008-10-21 23:43:52 +00002863 // until there are no more pointers or pointers-to-members left to
2864 // unwrap.
Douglas Gregor57373262008-10-22 14:17:15 +00002865 UnwrappedAnyPointer = true;
Douglas Gregor98cd5992008-10-21 23:43:52 +00002866
Douglas Gregor621c92a2011-04-25 18:40:17 +00002867 Qualifiers FromQuals = FromType.getQualifiers();
2868 Qualifiers ToQuals = ToType.getQualifiers();
2869
John McCallf85e1932011-06-15 23:02:42 +00002870 // Objective-C ARC:
2871 // Check Objective-C lifetime conversions.
2872 if (FromQuals.getObjCLifetime() != ToQuals.getObjCLifetime() &&
2873 UnwrappedAnyPointer) {
2874 if (ToQuals.compatiblyIncludesObjCLifetime(FromQuals)) {
2875 ObjCLifetimeConversion = true;
2876 FromQuals.removeObjCLifetime();
2877 ToQuals.removeObjCLifetime();
2878 } else {
2879 // Qualification conversions cannot cast between different
2880 // Objective-C lifetime qualifiers.
2881 return false;
2882 }
2883 }
2884
Douglas Gregor377e1bd2011-05-08 06:09:53 +00002885 // Allow addition/removal of GC attributes but not changing GC attributes.
2886 if (FromQuals.getObjCGCAttr() != ToQuals.getObjCGCAttr() &&
2887 (!FromQuals.hasObjCGCAttr() || !ToQuals.hasObjCGCAttr())) {
2888 FromQuals.removeObjCGCAttr();
2889 ToQuals.removeObjCGCAttr();
2890 }
2891
Douglas Gregor98cd5992008-10-21 23:43:52 +00002892 // -- for every j > 0, if const is in cv 1,j then const is in cv
2893 // 2,j, and similarly for volatile.
Douglas Gregor621c92a2011-04-25 18:40:17 +00002894 if (!CStyle && !ToQuals.compatiblyIncludes(FromQuals))
Douglas Gregor98cd5992008-10-21 23:43:52 +00002895 return false;
Mike Stump1eb44332009-09-09 15:08:12 +00002896
Douglas Gregor98cd5992008-10-21 23:43:52 +00002897 // -- if the cv 1,j and cv 2,j are different, then const is in
2898 // every cv for 0 < k < j.
Douglas Gregor621c92a2011-04-25 18:40:17 +00002899 if (!CStyle && FromQuals.getCVRQualifiers() != ToQuals.getCVRQualifiers()
Douglas Gregor57373262008-10-22 14:17:15 +00002900 && !PreviousToQualsIncludeConst)
Douglas Gregor98cd5992008-10-21 23:43:52 +00002901 return false;
Mike Stump1eb44332009-09-09 15:08:12 +00002902
Douglas Gregor98cd5992008-10-21 23:43:52 +00002903 // Keep track of whether all prior cv-qualifiers in the "to" type
2904 // include const.
Mike Stump1eb44332009-09-09 15:08:12 +00002905 PreviousToQualsIncludeConst
Douglas Gregor621c92a2011-04-25 18:40:17 +00002906 = PreviousToQualsIncludeConst && ToQuals.hasConst();
Douglas Gregor57373262008-10-22 14:17:15 +00002907 }
Douglas Gregor98cd5992008-10-21 23:43:52 +00002908
2909 // We are left with FromType and ToType being the pointee types
2910 // after unwrapping the original FromType and ToType the same number
2911 // of types. If we unwrapped any pointers, and if FromType and
2912 // ToType have the same unqualified type (since we checked
2913 // qualifiers above), then this is a qualification conversion.
Douglas Gregora4923eb2009-11-16 21:35:15 +00002914 return UnwrappedAnyPointer && Context.hasSameUnqualifiedType(FromType,ToType);
Douglas Gregor98cd5992008-10-21 23:43:52 +00002915}
2916
Douglas Gregorf7ecc302012-04-12 17:51:55 +00002917/// \brief - Determine whether this is a conversion from a scalar type to an
2918/// atomic type.
2919///
2920/// If successful, updates \c SCS's second and third steps in the conversion
2921/// sequence to finish the conversion.
Douglas Gregor7d000652012-04-12 20:48:09 +00002922static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType,
2923 bool InOverloadResolution,
2924 StandardConversionSequence &SCS,
2925 bool CStyle) {
Douglas Gregorf7ecc302012-04-12 17:51:55 +00002926 const AtomicType *ToAtomic = ToType->getAs<AtomicType>();
2927 if (!ToAtomic)
2928 return false;
2929
2930 StandardConversionSequence InnerSCS;
2931 if (!IsStandardConversion(S, From, ToAtomic->getValueType(),
2932 InOverloadResolution, InnerSCS,
2933 CStyle, /*AllowObjCWritebackConversion=*/false))
2934 return false;
2935
2936 SCS.Second = InnerSCS.Second;
2937 SCS.setToType(1, InnerSCS.getToType(1));
2938 SCS.Third = InnerSCS.Third;
2939 SCS.QualificationIncludesObjCLifetime
2940 = InnerSCS.QualificationIncludesObjCLifetime;
2941 SCS.setToType(2, InnerSCS.getToType(2));
2942 return true;
2943}
2944
Sebastian Redlf78c0f92012-03-27 18:33:03 +00002945static bool isFirstArgumentCompatibleWithType(ASTContext &Context,
2946 CXXConstructorDecl *Constructor,
2947 QualType Type) {
2948 const FunctionProtoType *CtorType =
2949 Constructor->getType()->getAs<FunctionProtoType>();
2950 if (CtorType->getNumArgs() > 0) {
2951 QualType FirstArg = CtorType->getArgType(0);
2952 if (Context.hasSameUnqualifiedType(Type, FirstArg.getNonReferenceType()))
2953 return true;
2954 }
2955 return false;
2956}
2957
Sebastian Redl56a04282012-02-11 23:51:08 +00002958static OverloadingResult
2959IsInitializerListConstructorConversion(Sema &S, Expr *From, QualType ToType,
2960 CXXRecordDecl *To,
2961 UserDefinedConversionSequence &User,
2962 OverloadCandidateSet &CandidateSet,
2963 bool AllowExplicit) {
David Blaikie3bc93e32012-12-19 00:45:41 +00002964 DeclContext::lookup_result R = S.LookupConstructors(To);
2965 for (DeclContext::lookup_iterator Con = R.begin(), ConEnd = R.end();
Sebastian Redl56a04282012-02-11 23:51:08 +00002966 Con != ConEnd; ++Con) {
2967 NamedDecl *D = *Con;
2968 DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess());
2969
2970 // Find the constructor (which may be a template).
2971 CXXConstructorDecl *Constructor = 0;
2972 FunctionTemplateDecl *ConstructorTmpl
2973 = dyn_cast<FunctionTemplateDecl>(D);
2974 if (ConstructorTmpl)
2975 Constructor
2976 = cast<CXXConstructorDecl>(ConstructorTmpl->getTemplatedDecl());
2977 else
2978 Constructor = cast<CXXConstructorDecl>(D);
2979
2980 bool Usable = !Constructor->isInvalidDecl() &&
2981 S.isInitListConstructor(Constructor) &&
2982 (AllowExplicit || !Constructor->isExplicit());
2983 if (Usable) {
Sebastian Redlf78c0f92012-03-27 18:33:03 +00002984 // If the first argument is (a reference to) the target type,
2985 // suppress conversions.
2986 bool SuppressUserConversions =
2987 isFirstArgumentCompatibleWithType(S.Context, Constructor, ToType);
Sebastian Redl56a04282012-02-11 23:51:08 +00002988 if (ConstructorTmpl)
2989 S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl,
2990 /*ExplicitArgs*/ 0,
Ahmed Charles13a140c2012-02-25 11:00:22 +00002991 From, CandidateSet,
Sebastian Redlf78c0f92012-03-27 18:33:03 +00002992 SuppressUserConversions);
Sebastian Redl56a04282012-02-11 23:51:08 +00002993 else
2994 S.AddOverloadCandidate(Constructor, FoundDecl,
Ahmed Charles13a140c2012-02-25 11:00:22 +00002995 From, CandidateSet,
Sebastian Redlf78c0f92012-03-27 18:33:03 +00002996 SuppressUserConversions);
Sebastian Redl56a04282012-02-11 23:51:08 +00002997 }
2998 }
2999
3000 bool HadMultipleCandidates = (CandidateSet.size() > 1);
3001
3002 OverloadCandidateSet::iterator Best;
3003 switch (CandidateSet.BestViableFunction(S, From->getLocStart(), Best, true)) {
3004 case OR_Success: {
3005 // Record the standard conversion we used and the conversion function.
3006 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function);
Sebastian Redl56a04282012-02-11 23:51:08 +00003007 QualType ThisType = Constructor->getThisType(S.Context);
3008 // Initializer lists don't have conversions as such.
3009 User.Before.setAsIdentityConversion();
3010 User.HadMultipleCandidates = HadMultipleCandidates;
3011 User.ConversionFunction = Constructor;
3012 User.FoundConversionFunction = Best->FoundDecl;
3013 User.After.setAsIdentityConversion();
3014 User.After.setFromType(ThisType->getAs<PointerType>()->getPointeeType());
3015 User.After.setAllToTypes(ToType);
3016 return OR_Success;
3017 }
3018
3019 case OR_No_Viable_Function:
3020 return OR_No_Viable_Function;
3021 case OR_Deleted:
3022 return OR_Deleted;
3023 case OR_Ambiguous:
3024 return OR_Ambiguous;
3025 }
3026
3027 llvm_unreachable("Invalid OverloadResult!");
3028}
3029
Douglas Gregor734d9862009-01-30 23:27:23 +00003030/// Determines whether there is a user-defined conversion sequence
3031/// (C++ [over.ics.user]) that converts expression From to the type
3032/// ToType. If such a conversion exists, User will contain the
3033/// user-defined conversion sequence that performs such a conversion
3034/// and this routine will return true. Otherwise, this routine returns
3035/// false and User is unspecified.
3036///
Douglas Gregor734d9862009-01-30 23:27:23 +00003037/// \param AllowExplicit true if the conversion should consider C++0x
3038/// "explicit" conversion functions as well as non-explicit conversion
3039/// functions (C++0x [class.conv.fct]p2).
John McCall120d63c2010-08-24 20:38:10 +00003040static OverloadingResult
3041IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType,
Sebastian Redl56a04282012-02-11 23:51:08 +00003042 UserDefinedConversionSequence &User,
3043 OverloadCandidateSet &CandidateSet,
John McCall120d63c2010-08-24 20:38:10 +00003044 bool AllowExplicit) {
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003045 // Whether we will only visit constructors.
3046 bool ConstructorsOnly = false;
3047
3048 // If the type we are conversion to is a class type, enumerate its
3049 // constructors.
Ted Kremenek6217b802009-07-29 21:53:49 +00003050 if (const RecordType *ToRecordType = ToType->getAs<RecordType>()) {
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003051 // C++ [over.match.ctor]p1:
3052 // When objects of class type are direct-initialized (8.5), or
3053 // copy-initialized from an expression of the same or a
3054 // derived class type (8.5), overload resolution selects the
3055 // constructor. [...] For copy-initialization, the candidate
3056 // functions are all the converting constructors (12.3.1) of
3057 // that class. The argument list is the expression-list within
3058 // the parentheses of the initializer.
John McCall120d63c2010-08-24 20:38:10 +00003059 if (S.Context.hasSameUnqualifiedType(ToType, From->getType()) ||
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003060 (From->getType()->getAs<RecordType>() &&
John McCall120d63c2010-08-24 20:38:10 +00003061 S.IsDerivedFrom(From->getType(), ToType)))
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003062 ConstructorsOnly = true;
3063
Benjamin Kramer63b6ebe2012-11-23 17:04:52 +00003064 S.RequireCompleteType(From->getExprLoc(), ToType, 0);
Argyrios Kyrtzidise36bca62011-04-22 17:45:37 +00003065 // RequireCompleteType may have returned true due to some invalid decl
3066 // during template instantiation, but ToType may be complete enough now
3067 // to try to recover.
3068 if (ToType->isIncompleteType()) {
Douglas Gregor393896f2009-11-05 13:06:35 +00003069 // We're not going to find any constructors.
3070 } else if (CXXRecordDecl *ToRecordDecl
3071 = dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
Sebastian Redlcf15cef2011-12-22 18:58:38 +00003072
3073 Expr **Args = &From;
3074 unsigned NumArgs = 1;
3075 bool ListInitializing = false;
Sebastian Redlcf15cef2011-12-22 18:58:38 +00003076 if (InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
Sebastian Redl56a04282012-02-11 23:51:08 +00003077 // But first, see if there is an init-list-contructor that will work.
3078 OverloadingResult Result = IsInitializerListConstructorConversion(
3079 S, From, ToType, ToRecordDecl, User, CandidateSet, AllowExplicit);
3080 if (Result != OR_No_Viable_Function)
3081 return Result;
3082 // Never mind.
3083 CandidateSet.clear();
3084
3085 // If we're list-initializing, we pass the individual elements as
3086 // arguments, not the entire list.
Sebastian Redlcf15cef2011-12-22 18:58:38 +00003087 Args = InitList->getInits();
3088 NumArgs = InitList->getNumInits();
3089 ListInitializing = true;
3090 }
3091
David Blaikie3bc93e32012-12-19 00:45:41 +00003092 DeclContext::lookup_result R = S.LookupConstructors(ToRecordDecl);
3093 for (DeclContext::lookup_iterator Con = R.begin(), ConEnd = R.end();
Douglas Gregorc1efaec2009-02-28 01:32:25 +00003094 Con != ConEnd; ++Con) {
John McCall9aa472c2010-03-19 07:35:19 +00003095 NamedDecl *D = *Con;
3096 DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess());
3097
Douglas Gregordec06662009-08-21 18:42:58 +00003098 // Find the constructor (which may be a template).
3099 CXXConstructorDecl *Constructor = 0;
3100 FunctionTemplateDecl *ConstructorTmpl
John McCall9aa472c2010-03-19 07:35:19 +00003101 = dyn_cast<FunctionTemplateDecl>(D);
Douglas Gregordec06662009-08-21 18:42:58 +00003102 if (ConstructorTmpl)
Mike Stump1eb44332009-09-09 15:08:12 +00003103 Constructor
Douglas Gregordec06662009-08-21 18:42:58 +00003104 = cast<CXXConstructorDecl>(ConstructorTmpl->getTemplatedDecl());
3105 else
John McCall9aa472c2010-03-19 07:35:19 +00003106 Constructor = cast<CXXConstructorDecl>(D);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003107
Sebastian Redlcf15cef2011-12-22 18:58:38 +00003108 bool Usable = !Constructor->isInvalidDecl();
3109 if (ListInitializing)
3110 Usable = Usable && (AllowExplicit || !Constructor->isExplicit());
3111 else
3112 Usable = Usable &&Constructor->isConvertingConstructor(AllowExplicit);
3113 if (Usable) {
Sebastian Redl1cd89c42012-03-20 21:24:14 +00003114 bool SuppressUserConversions = !ConstructorsOnly;
3115 if (SuppressUserConversions && ListInitializing) {
3116 SuppressUserConversions = false;
3117 if (NumArgs == 1) {
3118 // If the first argument is (a reference to) the target type,
3119 // suppress conversions.
Sebastian Redlf78c0f92012-03-27 18:33:03 +00003120 SuppressUserConversions = isFirstArgumentCompatibleWithType(
3121 S.Context, Constructor, ToType);
Sebastian Redl1cd89c42012-03-20 21:24:14 +00003122 }
3123 }
Douglas Gregordec06662009-08-21 18:42:58 +00003124 if (ConstructorTmpl)
John McCall120d63c2010-08-24 20:38:10 +00003125 S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl,
3126 /*ExplicitArgs*/ 0,
Ahmed Charles13a140c2012-02-25 11:00:22 +00003127 llvm::makeArrayRef(Args, NumArgs),
Sebastian Redl1cd89c42012-03-20 21:24:14 +00003128 CandidateSet, SuppressUserConversions);
Douglas Gregordec06662009-08-21 18:42:58 +00003129 else
Fariborz Jahanian249cead2009-10-01 20:39:51 +00003130 // Allow one user-defined conversion when user specifies a
3131 // From->ToType conversion via an static cast (c-style, etc).
John McCall120d63c2010-08-24 20:38:10 +00003132 S.AddOverloadCandidate(Constructor, FoundDecl,
Ahmed Charles13a140c2012-02-25 11:00:22 +00003133 llvm::makeArrayRef(Args, NumArgs),
Sebastian Redl1cd89c42012-03-20 21:24:14 +00003134 CandidateSet, SuppressUserConversions);
Douglas Gregordec06662009-08-21 18:42:58 +00003135 }
Douglas Gregorc1efaec2009-02-28 01:32:25 +00003136 }
Douglas Gregor60d62c22008-10-31 16:23:19 +00003137 }
3138 }
3139
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003140 // Enumerate conversion functions, if we're allowed to.
Sebastian Redlcf15cef2011-12-22 18:58:38 +00003141 if (ConstructorsOnly || isa<InitListExpr>(From)) {
Douglas Gregord10099e2012-05-04 16:32:21 +00003142 } else if (S.RequireCompleteType(From->getLocStart(), From->getType(), 0)) {
Douglas Gregor5842ba92009-08-24 15:23:48 +00003143 // No conversion functions from incomplete types.
Mike Stump1eb44332009-09-09 15:08:12 +00003144 } else if (const RecordType *FromRecordType
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003145 = From->getType()->getAs<RecordType>()) {
Mike Stump1eb44332009-09-09 15:08:12 +00003146 if (CXXRecordDecl *FromRecordDecl
Fariborz Jahanian8664ad52009-09-11 18:46:22 +00003147 = dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
3148 // Add all of the conversion functions as candidates.
Argyrios Kyrtzidis9d295432012-11-28 03:56:09 +00003149 std::pair<CXXRecordDecl::conversion_iterator,
3150 CXXRecordDecl::conversion_iterator>
3151 Conversions = FromRecordDecl->getVisibleConversionFunctions();
3152 for (CXXRecordDecl::conversion_iterator
3153 I = Conversions.first, E = Conversions.second; I != E; ++I) {
John McCall9aa472c2010-03-19 07:35:19 +00003154 DeclAccessPair FoundDecl = I.getPair();
3155 NamedDecl *D = FoundDecl.getDecl();
John McCall701c89e2009-12-03 04:06:58 +00003156 CXXRecordDecl *ActingContext = cast<CXXRecordDecl>(D->getDeclContext());
3157 if (isa<UsingShadowDecl>(D))
3158 D = cast<UsingShadowDecl>(D)->getTargetDecl();
3159
Fariborz Jahanian8664ad52009-09-11 18:46:22 +00003160 CXXConversionDecl *Conv;
3161 FunctionTemplateDecl *ConvTemplate;
John McCall32daa422010-03-31 01:36:47 +00003162 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
3163 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
Fariborz Jahanian8664ad52009-09-11 18:46:22 +00003164 else
John McCall32daa422010-03-31 01:36:47 +00003165 Conv = cast<CXXConversionDecl>(D);
Fariborz Jahanian8664ad52009-09-11 18:46:22 +00003166
3167 if (AllowExplicit || !Conv->isExplicit()) {
3168 if (ConvTemplate)
John McCall120d63c2010-08-24 20:38:10 +00003169 S.AddTemplateConversionCandidate(ConvTemplate, FoundDecl,
3170 ActingContext, From, ToType,
3171 CandidateSet);
Fariborz Jahanian8664ad52009-09-11 18:46:22 +00003172 else
John McCall120d63c2010-08-24 20:38:10 +00003173 S.AddConversionCandidate(Conv, FoundDecl, ActingContext,
3174 From, ToType, CandidateSet);
Fariborz Jahanian8664ad52009-09-11 18:46:22 +00003175 }
3176 }
3177 }
Douglas Gregorf1991ea2008-11-07 22:36:19 +00003178 }
Douglas Gregor60d62c22008-10-31 16:23:19 +00003179
Abramo Bagnara7cc58b42011-10-05 07:56:41 +00003180 bool HadMultipleCandidates = (CandidateSet.size() > 1);
3181
Douglas Gregor60d62c22008-10-31 16:23:19 +00003182 OverloadCandidateSet::iterator Best;
Douglas Gregor8fcc5162010-09-12 08:07:23 +00003183 switch (CandidateSet.BestViableFunction(S, From->getLocStart(), Best, true)) {
John McCall120d63c2010-08-24 20:38:10 +00003184 case OR_Success:
3185 // Record the standard conversion we used and the conversion function.
3186 if (CXXConstructorDecl *Constructor
3187 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
3188 // C++ [over.ics.user]p1:
3189 // If the user-defined conversion is specified by a
3190 // constructor (12.3.1), the initial standard conversion
3191 // sequence converts the source type to the type required by
3192 // the argument of the constructor.
3193 //
3194 QualType ThisType = Constructor->getThisType(S.Context);
Sebastian Redlcf15cef2011-12-22 18:58:38 +00003195 if (isa<InitListExpr>(From)) {
3196 // Initializer lists don't have conversions as such.
3197 User.Before.setAsIdentityConversion();
3198 } else {
3199 if (Best->Conversions[0].isEllipsis())
3200 User.EllipsisConversion = true;
3201 else {
3202 User.Before = Best->Conversions[0].Standard;
3203 User.EllipsisConversion = false;
3204 }
Douglas Gregor60d62c22008-10-31 16:23:19 +00003205 }
Abramo Bagnara7cc58b42011-10-05 07:56:41 +00003206 User.HadMultipleCandidates = HadMultipleCandidates;
John McCall120d63c2010-08-24 20:38:10 +00003207 User.ConversionFunction = Constructor;
John McCallca82a822011-09-21 08:36:56 +00003208 User.FoundConversionFunction = Best->FoundDecl;
John McCall120d63c2010-08-24 20:38:10 +00003209 User.After.setAsIdentityConversion();
3210 User.After.setFromType(ThisType->getAs<PointerType>()->getPointeeType());
3211 User.After.setAllToTypes(ToType);
3212 return OR_Success;
David Blaikie7530c032012-01-17 06:56:22 +00003213 }
3214 if (CXXConversionDecl *Conversion
John McCall120d63c2010-08-24 20:38:10 +00003215 = dyn_cast<CXXConversionDecl>(Best->Function)) {
3216 // C++ [over.ics.user]p1:
3217 //
3218 // [...] If the user-defined conversion is specified by a
3219 // conversion function (12.3.2), the initial standard
3220 // conversion sequence converts the source type to the
3221 // implicit object parameter of the conversion function.
3222 User.Before = Best->Conversions[0].Standard;
Abramo Bagnara7cc58b42011-10-05 07:56:41 +00003223 User.HadMultipleCandidates = HadMultipleCandidates;
John McCall120d63c2010-08-24 20:38:10 +00003224 User.ConversionFunction = Conversion;
John McCallca82a822011-09-21 08:36:56 +00003225 User.FoundConversionFunction = Best->FoundDecl;
John McCall120d63c2010-08-24 20:38:10 +00003226 User.EllipsisConversion = false;
Mike Stump1eb44332009-09-09 15:08:12 +00003227
John McCall120d63c2010-08-24 20:38:10 +00003228 // C++ [over.ics.user]p2:
3229 // The second standard conversion sequence converts the
3230 // result of the user-defined conversion to the target type
3231 // for the sequence. Since an implicit conversion sequence
3232 // is an initialization, the special rules for
3233 // initialization by user-defined conversion apply when
3234 // selecting the best user-defined conversion for a
3235 // user-defined conversion sequence (see 13.3.3 and
3236 // 13.3.3.1).
3237 User.After = Best->FinalConversion;
3238 return OR_Success;
Douglas Gregor60d62c22008-10-31 16:23:19 +00003239 }
David Blaikie7530c032012-01-17 06:56:22 +00003240 llvm_unreachable("Not a constructor or conversion function?");
Douglas Gregor60d62c22008-10-31 16:23:19 +00003241
John McCall120d63c2010-08-24 20:38:10 +00003242 case OR_No_Viable_Function:
3243 return OR_No_Viable_Function;
3244 case OR_Deleted:
3245 // No conversion here! We're done.
3246 return OR_Deleted;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003247
John McCall120d63c2010-08-24 20:38:10 +00003248 case OR_Ambiguous:
3249 return OR_Ambiguous;
3250 }
3251
David Blaikie7530c032012-01-17 06:56:22 +00003252 llvm_unreachable("Invalid OverloadResult!");
Douglas Gregor60d62c22008-10-31 16:23:19 +00003253}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003254
Fariborz Jahanian17c7a5d2009-09-22 20:24:30 +00003255bool
Fariborz Jahaniancc5306a2009-11-18 18:26:29 +00003256Sema::DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType) {
Fariborz Jahanian17c7a5d2009-09-22 20:24:30 +00003257 ImplicitConversionSequence ICS;
John McCall5769d612010-02-08 23:07:23 +00003258 OverloadCandidateSet CandidateSet(From->getExprLoc());
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003259 OverloadingResult OvResult =
John McCall120d63c2010-08-24 20:38:10 +00003260 IsUserDefinedConversion(*this, From, ToType, ICS.UserDefined,
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003261 CandidateSet, false);
Fariborz Jahaniancc5306a2009-11-18 18:26:29 +00003262 if (OvResult == OR_Ambiguous)
Daniel Dunbar96a00142012-03-09 18:35:03 +00003263 Diag(From->getLocStart(),
Fariborz Jahaniancc5306a2009-11-18 18:26:29 +00003264 diag::err_typecheck_ambiguous_condition)
3265 << From->getType() << ToType << From->getSourceRange();
3266 else if (OvResult == OR_No_Viable_Function && !CandidateSet.empty())
Daniel Dunbar96a00142012-03-09 18:35:03 +00003267 Diag(From->getLocStart(),
Fariborz Jahaniancc5306a2009-11-18 18:26:29 +00003268 diag::err_typecheck_nonviable_condition)
3269 << From->getType() << ToType << From->getSourceRange();
3270 else
Fariborz Jahanian17c7a5d2009-09-22 20:24:30 +00003271 return false;
Ahmed Charles13a140c2012-02-25 11:00:22 +00003272 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, From);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003273 return true;
Fariborz Jahanian17c7a5d2009-09-22 20:24:30 +00003274}
Douglas Gregor60d62c22008-10-31 16:23:19 +00003275
Douglas Gregorb734e242012-02-22 17:32:19 +00003276/// \brief Compare the user-defined conversion functions or constructors
3277/// of two user-defined conversion sequences to determine whether any ordering
3278/// is possible.
3279static ImplicitConversionSequence::CompareKind
3280compareConversionFunctions(Sema &S,
3281 FunctionDecl *Function1,
3282 FunctionDecl *Function2) {
Richard Smith80ad52f2013-01-02 11:42:31 +00003283 if (!S.getLangOpts().ObjC1 || !S.getLangOpts().CPlusPlus11)
Douglas Gregorb734e242012-02-22 17:32:19 +00003284 return ImplicitConversionSequence::Indistinguishable;
3285
3286 // Objective-C++:
3287 // If both conversion functions are implicitly-declared conversions from
3288 // a lambda closure type to a function pointer and a block pointer,
3289 // respectively, always prefer the conversion to a function pointer,
3290 // because the function pointer is more lightweight and is more likely
3291 // to keep code working.
3292 CXXConversionDecl *Conv1 = dyn_cast<CXXConversionDecl>(Function1);
3293 if (!Conv1)
3294 return ImplicitConversionSequence::Indistinguishable;
3295
3296 CXXConversionDecl *Conv2 = dyn_cast<CXXConversionDecl>(Function2);
3297 if (!Conv2)
3298 return ImplicitConversionSequence::Indistinguishable;
3299
3300 if (Conv1->getParent()->isLambda() && Conv2->getParent()->isLambda()) {
3301 bool Block1 = Conv1->getConversionType()->isBlockPointerType();
3302 bool Block2 = Conv2->getConversionType()->isBlockPointerType();
3303 if (Block1 != Block2)
3304 return Block1? ImplicitConversionSequence::Worse
3305 : ImplicitConversionSequence::Better;
3306 }
3307
3308 return ImplicitConversionSequence::Indistinguishable;
3309}
3310
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003311/// CompareImplicitConversionSequences - Compare two implicit
3312/// conversion sequences to determine whether one is better than the
3313/// other or if they are indistinguishable (C++ 13.3.3.2).
John McCall120d63c2010-08-24 20:38:10 +00003314static ImplicitConversionSequence::CompareKind
3315CompareImplicitConversionSequences(Sema &S,
3316 const ImplicitConversionSequence& ICS1,
3317 const ImplicitConversionSequence& ICS2)
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003318{
3319 // (C++ 13.3.3.2p2): When comparing the basic forms of implicit
3320 // conversion sequences (as defined in 13.3.3.1)
3321 // -- a standard conversion sequence (13.3.3.1.1) is a better
3322 // conversion sequence than a user-defined conversion sequence or
3323 // an ellipsis conversion sequence, and
3324 // -- a user-defined conversion sequence (13.3.3.1.2) is a better
3325 // conversion sequence than an ellipsis conversion sequence
3326 // (13.3.3.1.3).
Mike Stump1eb44332009-09-09 15:08:12 +00003327 //
John McCall1d318332010-01-12 00:44:57 +00003328 // C++0x [over.best.ics]p10:
3329 // For the purpose of ranking implicit conversion sequences as
3330 // described in 13.3.3.2, the ambiguous conversion sequence is
3331 // treated as a user-defined sequence that is indistinguishable
3332 // from any other user-defined conversion sequence.
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003333 if (ICS1.getKindRank() < ICS2.getKindRank())
3334 return ImplicitConversionSequence::Better;
David Blaikie7530c032012-01-17 06:56:22 +00003335 if (ICS2.getKindRank() < ICS1.getKindRank())
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003336 return ImplicitConversionSequence::Worse;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003337
Benjamin Kramerb6eee072010-04-18 12:05:54 +00003338 // The following checks require both conversion sequences to be of
3339 // the same kind.
3340 if (ICS1.getKind() != ICS2.getKind())
3341 return ImplicitConversionSequence::Indistinguishable;
3342
Sebastian Redlcc7a6482011-11-01 15:53:09 +00003343 ImplicitConversionSequence::CompareKind Result =
3344 ImplicitConversionSequence::Indistinguishable;
3345
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003346 // Two implicit conversion sequences of the same form are
3347 // indistinguishable conversion sequences unless one of the
3348 // following rules apply: (C++ 13.3.3.2p3):
John McCall1d318332010-01-12 00:44:57 +00003349 if (ICS1.isStandard())
Sebastian Redlcc7a6482011-11-01 15:53:09 +00003350 Result = CompareStandardConversionSequences(S,
3351 ICS1.Standard, ICS2.Standard);
John McCall1d318332010-01-12 00:44:57 +00003352 else if (ICS1.isUserDefined()) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003353 // User-defined conversion sequence U1 is a better conversion
3354 // sequence than another user-defined conversion sequence U2 if
3355 // they contain the same user-defined conversion function or
3356 // constructor and if the second standard conversion sequence of
3357 // U1 is better than the second standard conversion sequence of
3358 // U2 (C++ 13.3.3.2p3).
Mike Stump1eb44332009-09-09 15:08:12 +00003359 if (ICS1.UserDefined.ConversionFunction ==
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003360 ICS2.UserDefined.ConversionFunction)
Sebastian Redlcc7a6482011-11-01 15:53:09 +00003361 Result = CompareStandardConversionSequences(S,
3362 ICS1.UserDefined.After,
3363 ICS2.UserDefined.After);
Douglas Gregorb734e242012-02-22 17:32:19 +00003364 else
3365 Result = compareConversionFunctions(S,
3366 ICS1.UserDefined.ConversionFunction,
3367 ICS2.UserDefined.ConversionFunction);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003368 }
3369
Sebastian Redlcc7a6482011-11-01 15:53:09 +00003370 // List-initialization sequence L1 is a better conversion sequence than
3371 // list-initialization sequence L2 if L1 converts to std::initializer_list<X>
3372 // for some X and L2 does not.
3373 if (Result == ImplicitConversionSequence::Indistinguishable &&
Sebastian Redladfb5352012-02-27 22:38:26 +00003374 !ICS1.isBad() &&
Sebastian Redlcc7a6482011-11-01 15:53:09 +00003375 ICS1.isListInitializationSequence() &&
3376 ICS2.isListInitializationSequence()) {
Sebastian Redladfb5352012-02-27 22:38:26 +00003377 if (ICS1.isStdInitializerListElement() &&
3378 !ICS2.isStdInitializerListElement())
3379 return ImplicitConversionSequence::Better;
3380 if (!ICS1.isStdInitializerListElement() &&
3381 ICS2.isStdInitializerListElement())
3382 return ImplicitConversionSequence::Worse;
Sebastian Redlcc7a6482011-11-01 15:53:09 +00003383 }
3384
3385 return Result;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003386}
3387
Douglas Gregor5a57efd2010-06-09 03:53:18 +00003388static bool hasSimilarType(ASTContext &Context, QualType T1, QualType T2) {
3389 while (Context.UnwrapSimilarPointerTypes(T1, T2)) {
3390 Qualifiers Quals;
3391 T1 = Context.getUnqualifiedArrayType(T1, Quals);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003392 T2 = Context.getUnqualifiedArrayType(T2, Quals);
Douglas Gregor5a57efd2010-06-09 03:53:18 +00003393 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003394
Douglas Gregor5a57efd2010-06-09 03:53:18 +00003395 return Context.hasSameUnqualifiedType(T1, T2);
3396}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003397
Douglas Gregorad323a82010-01-27 03:51:04 +00003398// Per 13.3.3.2p3, compare the given standard conversion sequences to
3399// determine if one is a proper subset of the other.
3400static ImplicitConversionSequence::CompareKind
3401compareStandardConversionSubsets(ASTContext &Context,
3402 const StandardConversionSequence& SCS1,
3403 const StandardConversionSequence& SCS2) {
3404 ImplicitConversionSequence::CompareKind Result
3405 = ImplicitConversionSequence::Indistinguishable;
3406
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003407 // the identity conversion sequence is considered to be a subsequence of
Douglas Gregorae65f4b2010-05-23 22:10:15 +00003408 // any non-identity conversion sequence
Douglas Gregor4ae5b722011-06-05 06:15:20 +00003409 if (SCS1.isIdentityConversion() && !SCS2.isIdentityConversion())
3410 return ImplicitConversionSequence::Better;
3411 else if (!SCS1.isIdentityConversion() && SCS2.isIdentityConversion())
3412 return ImplicitConversionSequence::Worse;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003413
Douglas Gregorad323a82010-01-27 03:51:04 +00003414 if (SCS1.Second != SCS2.Second) {
3415 if (SCS1.Second == ICK_Identity)
3416 Result = ImplicitConversionSequence::Better;
3417 else if (SCS2.Second == ICK_Identity)
3418 Result = ImplicitConversionSequence::Worse;
3419 else
3420 return ImplicitConversionSequence::Indistinguishable;
Douglas Gregor5a57efd2010-06-09 03:53:18 +00003421 } else if (!hasSimilarType(Context, SCS1.getToType(1), SCS2.getToType(1)))
Douglas Gregorad323a82010-01-27 03:51:04 +00003422 return ImplicitConversionSequence::Indistinguishable;
3423
3424 if (SCS1.Third == SCS2.Third) {
3425 return Context.hasSameType(SCS1.getToType(2), SCS2.getToType(2))? Result
3426 : ImplicitConversionSequence::Indistinguishable;
3427 }
3428
3429 if (SCS1.Third == ICK_Identity)
3430 return Result == ImplicitConversionSequence::Worse
3431 ? ImplicitConversionSequence::Indistinguishable
3432 : ImplicitConversionSequence::Better;
3433
3434 if (SCS2.Third == ICK_Identity)
3435 return Result == ImplicitConversionSequence::Better
3436 ? ImplicitConversionSequence::Indistinguishable
3437 : ImplicitConversionSequence::Worse;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003438
Douglas Gregorad323a82010-01-27 03:51:04 +00003439 return ImplicitConversionSequence::Indistinguishable;
3440}
3441
Douglas Gregor440a4832011-01-26 14:52:12 +00003442/// \brief Determine whether one of the given reference bindings is better
3443/// than the other based on what kind of bindings they are.
3444static bool isBetterReferenceBindingKind(const StandardConversionSequence &SCS1,
3445 const StandardConversionSequence &SCS2) {
3446 // C++0x [over.ics.rank]p3b4:
3447 // -- S1 and S2 are reference bindings (8.5.3) and neither refers to an
3448 // implicit object parameter of a non-static member function declared
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003449 // without a ref-qualifier, and *either* S1 binds an rvalue reference
Douglas Gregor440a4832011-01-26 14:52:12 +00003450 // to an rvalue and S2 binds an lvalue reference *or S1 binds an
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003451 // lvalue reference to a function lvalue and S2 binds an rvalue
Douglas Gregor440a4832011-01-26 14:52:12 +00003452 // reference*.
3453 //
3454 // FIXME: Rvalue references. We're going rogue with the above edits,
3455 // because the semantics in the current C++0x working paper (N3225 at the
3456 // time of this writing) break the standard definition of std::forward
3457 // and std::reference_wrapper when dealing with references to functions.
3458 // Proposed wording changes submitted to CWG for consideration.
Douglas Gregorfcab48b2011-01-26 19:41:18 +00003459 if (SCS1.BindsImplicitObjectArgumentWithoutRefQualifier ||
3460 SCS2.BindsImplicitObjectArgumentWithoutRefQualifier)
3461 return false;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003462
Douglas Gregor440a4832011-01-26 14:52:12 +00003463 return (!SCS1.IsLvalueReference && SCS1.BindsToRvalue &&
3464 SCS2.IsLvalueReference) ||
3465 (SCS1.IsLvalueReference && SCS1.BindsToFunctionLvalue &&
3466 !SCS2.IsLvalueReference);
3467}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003468
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003469/// CompareStandardConversionSequences - Compare two standard
3470/// conversion sequences to determine whether one is better than the
3471/// other or if they are indistinguishable (C++ 13.3.3.2p3).
John McCall120d63c2010-08-24 20:38:10 +00003472static ImplicitConversionSequence::CompareKind
3473CompareStandardConversionSequences(Sema &S,
3474 const StandardConversionSequence& SCS1,
3475 const StandardConversionSequence& SCS2)
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003476{
3477 // Standard conversion sequence S1 is a better conversion sequence
3478 // than standard conversion sequence S2 if (C++ 13.3.3.2p3):
3479
3480 // -- S1 is a proper subsequence of S2 (comparing the conversion
3481 // sequences in the canonical form defined by 13.3.3.1.1,
3482 // excluding any Lvalue Transformation; the identity conversion
3483 // sequence is considered to be a subsequence of any
3484 // non-identity conversion sequence) or, if not that,
Douglas Gregorad323a82010-01-27 03:51:04 +00003485 if (ImplicitConversionSequence::CompareKind CK
John McCall120d63c2010-08-24 20:38:10 +00003486 = compareStandardConversionSubsets(S.Context, SCS1, SCS2))
Douglas Gregorad323a82010-01-27 03:51:04 +00003487 return CK;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003488
3489 // -- the rank of S1 is better than the rank of S2 (by the rules
3490 // defined below), or, if not that,
3491 ImplicitConversionRank Rank1 = SCS1.getRank();
3492 ImplicitConversionRank Rank2 = SCS2.getRank();
3493 if (Rank1 < Rank2)
3494 return ImplicitConversionSequence::Better;
3495 else if (Rank2 < Rank1)
3496 return ImplicitConversionSequence::Worse;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003497
Douglas Gregor57373262008-10-22 14:17:15 +00003498 // (C++ 13.3.3.2p4): Two conversion sequences with the same rank
3499 // are indistinguishable unless one of the following rules
3500 // applies:
Mike Stump1eb44332009-09-09 15:08:12 +00003501
Douglas Gregor57373262008-10-22 14:17:15 +00003502 // A conversion that is not a conversion of a pointer, or
3503 // pointer to member, to bool is better than another conversion
3504 // that is such a conversion.
3505 if (SCS1.isPointerConversionToBool() != SCS2.isPointerConversionToBool())
3506 return SCS2.isPointerConversionToBool()
3507 ? ImplicitConversionSequence::Better
3508 : ImplicitConversionSequence::Worse;
3509
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003510 // C++ [over.ics.rank]p4b2:
3511 //
3512 // If class B is derived directly or indirectly from class A,
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003513 // conversion of B* to A* is better than conversion of B* to
3514 // void*, and conversion of A* to void* is better than conversion
3515 // of B* to void*.
Mike Stump1eb44332009-09-09 15:08:12 +00003516 bool SCS1ConvertsToVoid
John McCall120d63c2010-08-24 20:38:10 +00003517 = SCS1.isPointerConversionToVoidPointer(S.Context);
Mike Stump1eb44332009-09-09 15:08:12 +00003518 bool SCS2ConvertsToVoid
John McCall120d63c2010-08-24 20:38:10 +00003519 = SCS2.isPointerConversionToVoidPointer(S.Context);
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003520 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
3521 // Exactly one of the conversion sequences is a conversion to
3522 // a void pointer; it's the worse conversion.
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003523 return SCS2ConvertsToVoid ? ImplicitConversionSequence::Better
3524 : ImplicitConversionSequence::Worse;
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003525 } else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
3526 // Neither conversion sequence converts to a void pointer; compare
3527 // their derived-to-base conversions.
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003528 if (ImplicitConversionSequence::CompareKind DerivedCK
John McCall120d63c2010-08-24 20:38:10 +00003529 = CompareDerivedToBaseConversions(S, SCS1, SCS2))
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003530 return DerivedCK;
Douglas Gregor0f7b3dc2011-04-27 00:01:52 +00003531 } else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
3532 !S.Context.hasSameType(SCS1.getFromType(), SCS2.getFromType())) {
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003533 // Both conversion sequences are conversions to void
3534 // pointers. Compare the source types to determine if there's an
3535 // inheritance relationship in their sources.
John McCall1d318332010-01-12 00:44:57 +00003536 QualType FromType1 = SCS1.getFromType();
3537 QualType FromType2 = SCS2.getFromType();
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003538
3539 // Adjust the types we're converting from via the array-to-pointer
3540 // conversion, if we need to.
3541 if (SCS1.First == ICK_Array_To_Pointer)
John McCall120d63c2010-08-24 20:38:10 +00003542 FromType1 = S.Context.getArrayDecayedType(FromType1);
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003543 if (SCS2.First == ICK_Array_To_Pointer)
John McCall120d63c2010-08-24 20:38:10 +00003544 FromType2 = S.Context.getArrayDecayedType(FromType2);
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003545
Douglas Gregor0f7b3dc2011-04-27 00:01:52 +00003546 QualType FromPointee1 = FromType1->getPointeeType().getUnqualifiedType();
3547 QualType FromPointee2 = FromType2->getPointeeType().getUnqualifiedType();
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003548
John McCall120d63c2010-08-24 20:38:10 +00003549 if (S.IsDerivedFrom(FromPointee2, FromPointee1))
Douglas Gregor01919692009-12-13 21:37:05 +00003550 return ImplicitConversionSequence::Better;
John McCall120d63c2010-08-24 20:38:10 +00003551 else if (S.IsDerivedFrom(FromPointee1, FromPointee2))
Douglas Gregor01919692009-12-13 21:37:05 +00003552 return ImplicitConversionSequence::Worse;
3553
3554 // Objective-C++: If one interface is more specific than the
3555 // other, it is the better one.
Douglas Gregor0f7b3dc2011-04-27 00:01:52 +00003556 const ObjCObjectPointerType* FromObjCPtr1
3557 = FromType1->getAs<ObjCObjectPointerType>();
3558 const ObjCObjectPointerType* FromObjCPtr2
3559 = FromType2->getAs<ObjCObjectPointerType>();
3560 if (FromObjCPtr1 && FromObjCPtr2) {
3561 bool AssignLeft = S.Context.canAssignObjCInterfaces(FromObjCPtr1,
3562 FromObjCPtr2);
3563 bool AssignRight = S.Context.canAssignObjCInterfaces(FromObjCPtr2,
3564 FromObjCPtr1);
3565 if (AssignLeft != AssignRight) {
3566 return AssignLeft? ImplicitConversionSequence::Better
3567 : ImplicitConversionSequence::Worse;
3568 }
Douglas Gregor01919692009-12-13 21:37:05 +00003569 }
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003570 }
Douglas Gregor57373262008-10-22 14:17:15 +00003571
3572 // Compare based on qualification conversions (C++ 13.3.3.2p3,
3573 // bullet 3).
Mike Stump1eb44332009-09-09 15:08:12 +00003574 if (ImplicitConversionSequence::CompareKind QualCK
John McCall120d63c2010-08-24 20:38:10 +00003575 = CompareQualificationConversions(S, SCS1, SCS2))
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003576 return QualCK;
Douglas Gregor57373262008-10-22 14:17:15 +00003577
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003578 if (SCS1.ReferenceBinding && SCS2.ReferenceBinding) {
Douglas Gregor440a4832011-01-26 14:52:12 +00003579 // Check for a better reference binding based on the kind of bindings.
3580 if (isBetterReferenceBindingKind(SCS1, SCS2))
3581 return ImplicitConversionSequence::Better;
3582 else if (isBetterReferenceBindingKind(SCS2, SCS1))
3583 return ImplicitConversionSequence::Worse;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003584
Sebastian Redlf2e21e52009-03-22 23:49:27 +00003585 // C++ [over.ics.rank]p3b4:
3586 // -- S1 and S2 are reference bindings (8.5.3), and the types to
3587 // which the references refer are the same type except for
3588 // top-level cv-qualifiers, and the type to which the reference
3589 // initialized by S2 refers is more cv-qualified than the type
3590 // to which the reference initialized by S1 refers.
Douglas Gregorad323a82010-01-27 03:51:04 +00003591 QualType T1 = SCS1.getToType(2);
3592 QualType T2 = SCS2.getToType(2);
John McCall120d63c2010-08-24 20:38:10 +00003593 T1 = S.Context.getCanonicalType(T1);
3594 T2 = S.Context.getCanonicalType(T2);
Chandler Carruth28e318c2009-12-29 07:16:59 +00003595 Qualifiers T1Quals, T2Quals;
John McCall120d63c2010-08-24 20:38:10 +00003596 QualType UnqualT1 = S.Context.getUnqualifiedArrayType(T1, T1Quals);
3597 QualType UnqualT2 = S.Context.getUnqualifiedArrayType(T2, T2Quals);
Chandler Carruth28e318c2009-12-29 07:16:59 +00003598 if (UnqualT1 == UnqualT2) {
John McCallf85e1932011-06-15 23:02:42 +00003599 // Objective-C++ ARC: If the references refer to objects with different
3600 // lifetimes, prefer bindings that don't change lifetime.
3601 if (SCS1.ObjCLifetimeConversionBinding !=
3602 SCS2.ObjCLifetimeConversionBinding) {
3603 return SCS1.ObjCLifetimeConversionBinding
3604 ? ImplicitConversionSequence::Worse
3605 : ImplicitConversionSequence::Better;
3606 }
3607
Chandler Carruth6df868e2010-12-12 08:17:55 +00003608 // If the type is an array type, promote the element qualifiers to the
3609 // type for comparison.
Chandler Carruth28e318c2009-12-29 07:16:59 +00003610 if (isa<ArrayType>(T1) && T1Quals)
John McCall120d63c2010-08-24 20:38:10 +00003611 T1 = S.Context.getQualifiedType(UnqualT1, T1Quals);
Chandler Carruth28e318c2009-12-29 07:16:59 +00003612 if (isa<ArrayType>(T2) && T2Quals)
John McCall120d63c2010-08-24 20:38:10 +00003613 T2 = S.Context.getQualifiedType(UnqualT2, T2Quals);
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003614 if (T2.isMoreQualifiedThan(T1))
3615 return ImplicitConversionSequence::Better;
3616 else if (T1.isMoreQualifiedThan(T2))
John McCallf85e1932011-06-15 23:02:42 +00003617 return ImplicitConversionSequence::Worse;
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003618 }
3619 }
Douglas Gregor57373262008-10-22 14:17:15 +00003620
Francois Pichet1c98d622011-09-18 21:37:37 +00003621 // In Microsoft mode, prefer an integral conversion to a
3622 // floating-to-integral conversion if the integral conversion
3623 // is between types of the same size.
3624 // For example:
3625 // void f(float);
3626 // void f(int);
3627 // int main {
3628 // long a;
3629 // f(a);
3630 // }
3631 // Here, MSVC will call f(int) instead of generating a compile error
3632 // as clang will do in standard mode.
David Blaikie4e4d0842012-03-11 07:00:24 +00003633 if (S.getLangOpts().MicrosoftMode &&
Francois Pichet1c98d622011-09-18 21:37:37 +00003634 SCS1.Second == ICK_Integral_Conversion &&
3635 SCS2.Second == ICK_Floating_Integral &&
3636 S.Context.getTypeSize(SCS1.getFromType()) ==
3637 S.Context.getTypeSize(SCS1.getToType(2)))
3638 return ImplicitConversionSequence::Better;
3639
Douglas Gregor57373262008-10-22 14:17:15 +00003640 return ImplicitConversionSequence::Indistinguishable;
3641}
3642
3643/// CompareQualificationConversions - Compares two standard conversion
3644/// sequences to determine whether they can be ranked based on their
Mike Stump1eb44332009-09-09 15:08:12 +00003645/// qualification conversions (C++ 13.3.3.2p3 bullet 3).
3646ImplicitConversionSequence::CompareKind
John McCall120d63c2010-08-24 20:38:10 +00003647CompareQualificationConversions(Sema &S,
3648 const StandardConversionSequence& SCS1,
3649 const StandardConversionSequence& SCS2) {
Douglas Gregorba7e2102008-10-22 15:04:37 +00003650 // C++ 13.3.3.2p3:
Douglas Gregor57373262008-10-22 14:17:15 +00003651 // -- S1 and S2 differ only in their qualification conversion and
3652 // yield similar types T1 and T2 (C++ 4.4), respectively, and the
3653 // cv-qualification signature of type T1 is a proper subset of
3654 // the cv-qualification signature of type T2, and S1 is not the
3655 // deprecated string literal array-to-pointer conversion (4.2).
3656 if (SCS1.First != SCS2.First || SCS1.Second != SCS2.Second ||
3657 SCS1.Third != SCS2.Third || SCS1.Third != ICK_Qualification)
3658 return ImplicitConversionSequence::Indistinguishable;
3659
3660 // FIXME: the example in the standard doesn't use a qualification
3661 // conversion (!)
Douglas Gregorad323a82010-01-27 03:51:04 +00003662 QualType T1 = SCS1.getToType(2);
3663 QualType T2 = SCS2.getToType(2);
John McCall120d63c2010-08-24 20:38:10 +00003664 T1 = S.Context.getCanonicalType(T1);
3665 T2 = S.Context.getCanonicalType(T2);
Chandler Carruth28e318c2009-12-29 07:16:59 +00003666 Qualifiers T1Quals, T2Quals;
John McCall120d63c2010-08-24 20:38:10 +00003667 QualType UnqualT1 = S.Context.getUnqualifiedArrayType(T1, T1Quals);
3668 QualType UnqualT2 = S.Context.getUnqualifiedArrayType(T2, T2Quals);
Douglas Gregor57373262008-10-22 14:17:15 +00003669
3670 // If the types are the same, we won't learn anything by unwrapped
3671 // them.
Chandler Carruth28e318c2009-12-29 07:16:59 +00003672 if (UnqualT1 == UnqualT2)
Douglas Gregor57373262008-10-22 14:17:15 +00003673 return ImplicitConversionSequence::Indistinguishable;
3674
Chandler Carruth28e318c2009-12-29 07:16:59 +00003675 // If the type is an array type, promote the element qualifiers to the type
3676 // for comparison.
3677 if (isa<ArrayType>(T1) && T1Quals)
John McCall120d63c2010-08-24 20:38:10 +00003678 T1 = S.Context.getQualifiedType(UnqualT1, T1Quals);
Chandler Carruth28e318c2009-12-29 07:16:59 +00003679 if (isa<ArrayType>(T2) && T2Quals)
John McCall120d63c2010-08-24 20:38:10 +00003680 T2 = S.Context.getQualifiedType(UnqualT2, T2Quals);
Chandler Carruth28e318c2009-12-29 07:16:59 +00003681
Mike Stump1eb44332009-09-09 15:08:12 +00003682 ImplicitConversionSequence::CompareKind Result
Douglas Gregor57373262008-10-22 14:17:15 +00003683 = ImplicitConversionSequence::Indistinguishable;
John McCallf85e1932011-06-15 23:02:42 +00003684
3685 // Objective-C++ ARC:
3686 // Prefer qualification conversions not involving a change in lifetime
3687 // to qualification conversions that do not change lifetime.
3688 if (SCS1.QualificationIncludesObjCLifetime !=
3689 SCS2.QualificationIncludesObjCLifetime) {
3690 Result = SCS1.QualificationIncludesObjCLifetime
3691 ? ImplicitConversionSequence::Worse
3692 : ImplicitConversionSequence::Better;
3693 }
3694
John McCall120d63c2010-08-24 20:38:10 +00003695 while (S.Context.UnwrapSimilarPointerTypes(T1, T2)) {
Douglas Gregor57373262008-10-22 14:17:15 +00003696 // Within each iteration of the loop, we check the qualifiers to
3697 // determine if this still looks like a qualification
3698 // conversion. Then, if all is well, we unwrap one more level of
Douglas Gregorf8268ae2008-10-22 17:49:05 +00003699 // pointers or pointers-to-members and do it all again
Douglas Gregor57373262008-10-22 14:17:15 +00003700 // until there are no more pointers or pointers-to-members left
3701 // to unwrap. This essentially mimics what
3702 // IsQualificationConversion does, but here we're checking for a
3703 // strict subset of qualifiers.
3704 if (T1.getCVRQualifiers() == T2.getCVRQualifiers())
3705 // The qualifiers are the same, so this doesn't tell us anything
3706 // about how the sequences rank.
3707 ;
3708 else if (T2.isMoreQualifiedThan(T1)) {
3709 // T1 has fewer qualifiers, so it could be the better sequence.
3710 if (Result == ImplicitConversionSequence::Worse)
3711 // Neither has qualifiers that are a subset of the other's
3712 // qualifiers.
3713 return ImplicitConversionSequence::Indistinguishable;
Mike Stump1eb44332009-09-09 15:08:12 +00003714
Douglas Gregor57373262008-10-22 14:17:15 +00003715 Result = ImplicitConversionSequence::Better;
3716 } else if (T1.isMoreQualifiedThan(T2)) {
3717 // T2 has fewer qualifiers, so it could be the better sequence.
3718 if (Result == ImplicitConversionSequence::Better)
3719 // Neither has qualifiers that are a subset of the other's
3720 // qualifiers.
3721 return ImplicitConversionSequence::Indistinguishable;
Mike Stump1eb44332009-09-09 15:08:12 +00003722
Douglas Gregor57373262008-10-22 14:17:15 +00003723 Result = ImplicitConversionSequence::Worse;
3724 } else {
3725 // Qualifiers are disjoint.
3726 return ImplicitConversionSequence::Indistinguishable;
3727 }
3728
3729 // If the types after this point are equivalent, we're done.
John McCall120d63c2010-08-24 20:38:10 +00003730 if (S.Context.hasSameUnqualifiedType(T1, T2))
Douglas Gregor57373262008-10-22 14:17:15 +00003731 break;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003732 }
3733
Douglas Gregor57373262008-10-22 14:17:15 +00003734 // Check that the winning standard conversion sequence isn't using
3735 // the deprecated string literal array to pointer conversion.
3736 switch (Result) {
3737 case ImplicitConversionSequence::Better:
Douglas Gregora9bff302010-02-28 18:30:25 +00003738 if (SCS1.DeprecatedStringLiteralToCharPtr)
Douglas Gregor57373262008-10-22 14:17:15 +00003739 Result = ImplicitConversionSequence::Indistinguishable;
3740 break;
3741
3742 case ImplicitConversionSequence::Indistinguishable:
3743 break;
3744
3745 case ImplicitConversionSequence::Worse:
Douglas Gregora9bff302010-02-28 18:30:25 +00003746 if (SCS2.DeprecatedStringLiteralToCharPtr)
Douglas Gregor57373262008-10-22 14:17:15 +00003747 Result = ImplicitConversionSequence::Indistinguishable;
3748 break;
3749 }
3750
3751 return Result;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00003752}
3753
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003754/// CompareDerivedToBaseConversions - Compares two standard conversion
3755/// sequences to determine whether they can be ranked based on their
Douglas Gregorcb7de522008-11-26 23:31:11 +00003756/// various kinds of derived-to-base conversions (C++
3757/// [over.ics.rank]p4b3). As part of these checks, we also look at
3758/// conversions between Objective-C interface types.
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003759ImplicitConversionSequence::CompareKind
John McCall120d63c2010-08-24 20:38:10 +00003760CompareDerivedToBaseConversions(Sema &S,
3761 const StandardConversionSequence& SCS1,
3762 const StandardConversionSequence& SCS2) {
John McCall1d318332010-01-12 00:44:57 +00003763 QualType FromType1 = SCS1.getFromType();
Douglas Gregorad323a82010-01-27 03:51:04 +00003764 QualType ToType1 = SCS1.getToType(1);
John McCall1d318332010-01-12 00:44:57 +00003765 QualType FromType2 = SCS2.getFromType();
Douglas Gregorad323a82010-01-27 03:51:04 +00003766 QualType ToType2 = SCS2.getToType(1);
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003767
3768 // Adjust the types we're converting from via the array-to-pointer
3769 // conversion, if we need to.
3770 if (SCS1.First == ICK_Array_To_Pointer)
John McCall120d63c2010-08-24 20:38:10 +00003771 FromType1 = S.Context.getArrayDecayedType(FromType1);
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003772 if (SCS2.First == ICK_Array_To_Pointer)
John McCall120d63c2010-08-24 20:38:10 +00003773 FromType2 = S.Context.getArrayDecayedType(FromType2);
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003774
3775 // Canonicalize all of the types.
John McCall120d63c2010-08-24 20:38:10 +00003776 FromType1 = S.Context.getCanonicalType(FromType1);
3777 ToType1 = S.Context.getCanonicalType(ToType1);
3778 FromType2 = S.Context.getCanonicalType(FromType2);
3779 ToType2 = S.Context.getCanonicalType(ToType2);
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003780
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003781 // C++ [over.ics.rank]p4b3:
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003782 //
3783 // If class B is derived directly or indirectly from class A and
3784 // class C is derived directly or indirectly from B,
Douglas Gregorcb7de522008-11-26 23:31:11 +00003785 //
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003786 // Compare based on pointer conversions.
Mike Stump1eb44332009-09-09 15:08:12 +00003787 if (SCS1.Second == ICK_Pointer_Conversion &&
Douglas Gregor7ca09762008-11-27 01:19:21 +00003788 SCS2.Second == ICK_Pointer_Conversion &&
3789 /*FIXME: Remove if Objective-C id conversions get their own rank*/
3790 FromType1->isPointerType() && FromType2->isPointerType() &&
3791 ToType1->isPointerType() && ToType2->isPointerType()) {
Mike Stump1eb44332009-09-09 15:08:12 +00003792 QualType FromPointee1
Ted Kremenek6217b802009-07-29 21:53:49 +00003793 = FromType1->getAs<PointerType>()->getPointeeType().getUnqualifiedType();
Mike Stump1eb44332009-09-09 15:08:12 +00003794 QualType ToPointee1
Ted Kremenek6217b802009-07-29 21:53:49 +00003795 = ToType1->getAs<PointerType>()->getPointeeType().getUnqualifiedType();
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003796 QualType FromPointee2
Ted Kremenek6217b802009-07-29 21:53:49 +00003797 = FromType2->getAs<PointerType>()->getPointeeType().getUnqualifiedType();
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003798 QualType ToPointee2
Ted Kremenek6217b802009-07-29 21:53:49 +00003799 = ToType2->getAs<PointerType>()->getPointeeType().getUnqualifiedType();
Douglas Gregorcb7de522008-11-26 23:31:11 +00003800
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003801 // -- conversion of C* to B* is better than conversion of C* to A*,
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003802 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
John McCall120d63c2010-08-24 20:38:10 +00003803 if (S.IsDerivedFrom(ToPointee1, ToPointee2))
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003804 return ImplicitConversionSequence::Better;
John McCall120d63c2010-08-24 20:38:10 +00003805 else if (S.IsDerivedFrom(ToPointee2, ToPointee1))
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003806 return ImplicitConversionSequence::Worse;
3807 }
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003808
3809 // -- conversion of B* to A* is better than conversion of C* to A*,
3810 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
John McCall120d63c2010-08-24 20:38:10 +00003811 if (S.IsDerivedFrom(FromPointee2, FromPointee1))
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003812 return ImplicitConversionSequence::Better;
John McCall120d63c2010-08-24 20:38:10 +00003813 else if (S.IsDerivedFrom(FromPointee1, FromPointee2))
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003814 return ImplicitConversionSequence::Worse;
Douglas Gregor395cc372011-01-31 18:51:41 +00003815 }
3816 } else if (SCS1.Second == ICK_Pointer_Conversion &&
3817 SCS2.Second == ICK_Pointer_Conversion) {
3818 const ObjCObjectPointerType *FromPtr1
3819 = FromType1->getAs<ObjCObjectPointerType>();
3820 const ObjCObjectPointerType *FromPtr2
3821 = FromType2->getAs<ObjCObjectPointerType>();
3822 const ObjCObjectPointerType *ToPtr1
3823 = ToType1->getAs<ObjCObjectPointerType>();
3824 const ObjCObjectPointerType *ToPtr2
3825 = ToType2->getAs<ObjCObjectPointerType>();
3826
3827 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
3828 // Apply the same conversion ranking rules for Objective-C pointer types
3829 // that we do for C++ pointers to class types. However, we employ the
3830 // Objective-C pseudo-subtyping relationship used for assignment of
3831 // Objective-C pointer types.
3832 bool FromAssignLeft
3833 = S.Context.canAssignObjCInterfaces(FromPtr1, FromPtr2);
3834 bool FromAssignRight
3835 = S.Context.canAssignObjCInterfaces(FromPtr2, FromPtr1);
3836 bool ToAssignLeft
3837 = S.Context.canAssignObjCInterfaces(ToPtr1, ToPtr2);
3838 bool ToAssignRight
3839 = S.Context.canAssignObjCInterfaces(ToPtr2, ToPtr1);
3840
3841 // A conversion to an a non-id object pointer type or qualified 'id'
3842 // type is better than a conversion to 'id'.
3843 if (ToPtr1->isObjCIdType() &&
3844 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
3845 return ImplicitConversionSequence::Worse;
3846 if (ToPtr2->isObjCIdType() &&
3847 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
3848 return ImplicitConversionSequence::Better;
3849
3850 // A conversion to a non-id object pointer type is better than a
3851 // conversion to a qualified 'id' type
3852 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
3853 return ImplicitConversionSequence::Worse;
3854 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
3855 return ImplicitConversionSequence::Better;
3856
3857 // A conversion to an a non-Class object pointer type or qualified 'Class'
3858 // type is better than a conversion to 'Class'.
3859 if (ToPtr1->isObjCClassType() &&
3860 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
3861 return ImplicitConversionSequence::Worse;
3862 if (ToPtr2->isObjCClassType() &&
3863 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
3864 return ImplicitConversionSequence::Better;
3865
3866 // A conversion to a non-Class object pointer type is better than a
3867 // conversion to a qualified 'Class' type.
3868 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
3869 return ImplicitConversionSequence::Worse;
3870 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
3871 return ImplicitConversionSequence::Better;
Mike Stump1eb44332009-09-09 15:08:12 +00003872
Douglas Gregor395cc372011-01-31 18:51:41 +00003873 // -- "conversion of C* to B* is better than conversion of C* to A*,"
3874 if (S.Context.hasSameType(FromType1, FromType2) &&
3875 !FromPtr1->isObjCIdType() && !FromPtr1->isObjCClassType() &&
3876 (ToAssignLeft != ToAssignRight))
3877 return ToAssignLeft? ImplicitConversionSequence::Worse
3878 : ImplicitConversionSequence::Better;
3879
3880 // -- "conversion of B* to A* is better than conversion of C* to A*,"
3881 if (S.Context.hasSameUnqualifiedType(ToType1, ToType2) &&
3882 (FromAssignLeft != FromAssignRight))
3883 return FromAssignLeft? ImplicitConversionSequence::Better
3884 : ImplicitConversionSequence::Worse;
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003885 }
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003886 }
Douglas Gregor395cc372011-01-31 18:51:41 +00003887
Fariborz Jahanian2357da02009-10-20 20:07:35 +00003888 // Ranking of member-pointer types.
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003889 if (SCS1.Second == ICK_Pointer_Member && SCS2.Second == ICK_Pointer_Member &&
3890 FromType1->isMemberPointerType() && FromType2->isMemberPointerType() &&
3891 ToType1->isMemberPointerType() && ToType2->isMemberPointerType()) {
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003892 const MemberPointerType * FromMemPointer1 =
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003893 FromType1->getAs<MemberPointerType>();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003894 const MemberPointerType * ToMemPointer1 =
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003895 ToType1->getAs<MemberPointerType>();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003896 const MemberPointerType * FromMemPointer2 =
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003897 FromType2->getAs<MemberPointerType>();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003898 const MemberPointerType * ToMemPointer2 =
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003899 ToType2->getAs<MemberPointerType>();
3900 const Type *FromPointeeType1 = FromMemPointer1->getClass();
3901 const Type *ToPointeeType1 = ToMemPointer1->getClass();
3902 const Type *FromPointeeType2 = FromMemPointer2->getClass();
3903 const Type *ToPointeeType2 = ToMemPointer2->getClass();
3904 QualType FromPointee1 = QualType(FromPointeeType1, 0).getUnqualifiedType();
3905 QualType ToPointee1 = QualType(ToPointeeType1, 0).getUnqualifiedType();
3906 QualType FromPointee2 = QualType(FromPointeeType2, 0).getUnqualifiedType();
3907 QualType ToPointee2 = QualType(ToPointeeType2, 0).getUnqualifiedType();
Fariborz Jahanian2357da02009-10-20 20:07:35 +00003908 // conversion of A::* to B::* is better than conversion of A::* to C::*,
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003909 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
John McCall120d63c2010-08-24 20:38:10 +00003910 if (S.IsDerivedFrom(ToPointee1, ToPointee2))
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003911 return ImplicitConversionSequence::Worse;
John McCall120d63c2010-08-24 20:38:10 +00003912 else if (S.IsDerivedFrom(ToPointee2, ToPointee1))
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003913 return ImplicitConversionSequence::Better;
3914 }
3915 // conversion of B::* to C::* is better than conversion of A::* to C::*
3916 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
John McCall120d63c2010-08-24 20:38:10 +00003917 if (S.IsDerivedFrom(FromPointee1, FromPointee2))
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003918 return ImplicitConversionSequence::Better;
John McCall120d63c2010-08-24 20:38:10 +00003919 else if (S.IsDerivedFrom(FromPointee2, FromPointee1))
Fariborz Jahanian8577c982009-10-20 20:04:46 +00003920 return ImplicitConversionSequence::Worse;
3921 }
3922 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00003923
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00003924 if (SCS1.Second == ICK_Derived_To_Base) {
Douglas Gregor225c41e2008-11-03 19:09:14 +00003925 // -- conversion of C to B is better than conversion of C to A,
Douglas Gregor9e239322010-02-25 19:01:05 +00003926 // -- binding of an expression of type C to a reference of type
3927 // B& is better than binding an expression of type C to a
3928 // reference of type A&,
John McCall120d63c2010-08-24 20:38:10 +00003929 if (S.Context.hasSameUnqualifiedType(FromType1, FromType2) &&
3930 !S.Context.hasSameUnqualifiedType(ToType1, ToType2)) {
3931 if (S.IsDerivedFrom(ToType1, ToType2))
Douglas Gregor225c41e2008-11-03 19:09:14 +00003932 return ImplicitConversionSequence::Better;
John McCall120d63c2010-08-24 20:38:10 +00003933 else if (S.IsDerivedFrom(ToType2, ToType1))
Douglas Gregor225c41e2008-11-03 19:09:14 +00003934 return ImplicitConversionSequence::Worse;
3935 }
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003936
Douglas Gregor225c41e2008-11-03 19:09:14 +00003937 // -- conversion of B to A is better than conversion of C to A.
Douglas Gregor9e239322010-02-25 19:01:05 +00003938 // -- binding of an expression of type B to a reference of type
3939 // A& is better than binding an expression of type C to a
3940 // reference of type A&,
John McCall120d63c2010-08-24 20:38:10 +00003941 if (!S.Context.hasSameUnqualifiedType(FromType1, FromType2) &&
3942 S.Context.hasSameUnqualifiedType(ToType1, ToType2)) {
3943 if (S.IsDerivedFrom(FromType2, FromType1))
Douglas Gregor225c41e2008-11-03 19:09:14 +00003944 return ImplicitConversionSequence::Better;
John McCall120d63c2010-08-24 20:38:10 +00003945 else if (S.IsDerivedFrom(FromType1, FromType2))
Douglas Gregor225c41e2008-11-03 19:09:14 +00003946 return ImplicitConversionSequence::Worse;
3947 }
3948 }
Douglas Gregorf70bdb92008-10-29 14:50:44 +00003949
Douglas Gregorbc0805a2008-10-23 00:40:37 +00003950 return ImplicitConversionSequence::Indistinguishable;
3951}
3952
Douglas Gregor0162c1c2013-03-26 23:36:30 +00003953/// \brief Determine whether the given type is valid, e.g., it is not an invalid
3954/// C++ class.
3955static bool isTypeValid(QualType T) {
3956 if (CXXRecordDecl *Record = T->getAsCXXRecordDecl())
3957 return !Record->isInvalidDecl();
3958
3959 return true;
3960}
3961
Douglas Gregorabe183d2010-04-13 16:31:36 +00003962/// CompareReferenceRelationship - Compare the two types T1 and T2 to
3963/// determine whether they are reference-related,
3964/// reference-compatible, reference-compatible with added
3965/// qualification, or incompatible, for use in C++ initialization by
3966/// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
3967/// type, and the first type (T1) is the pointee type of the reference
3968/// type being initialized.
3969Sema::ReferenceCompareResult
3970Sema::CompareReferenceRelationship(SourceLocation Loc,
3971 QualType OrigT1, QualType OrigT2,
Douglas Gregor569c3162010-08-07 11:51:51 +00003972 bool &DerivedToBase,
John McCallf85e1932011-06-15 23:02:42 +00003973 bool &ObjCConversion,
3974 bool &ObjCLifetimeConversion) {
Douglas Gregorabe183d2010-04-13 16:31:36 +00003975 assert(!OrigT1->isReferenceType() &&
3976 "T1 must be the pointee type of the reference type");
3977 assert(!OrigT2->isReferenceType() && "T2 cannot be a reference type");
3978
3979 QualType T1 = Context.getCanonicalType(OrigT1);
3980 QualType T2 = Context.getCanonicalType(OrigT2);
3981 Qualifiers T1Quals, T2Quals;
3982 QualType UnqualT1 = Context.getUnqualifiedArrayType(T1, T1Quals);
3983 QualType UnqualT2 = Context.getUnqualifiedArrayType(T2, T2Quals);
3984
3985 // C++ [dcl.init.ref]p4:
3986 // Given types "cv1 T1" and "cv2 T2," "cv1 T1" is
3987 // reference-related to "cv2 T2" if T1 is the same type as T2, or
3988 // T1 is a base class of T2.
Douglas Gregor569c3162010-08-07 11:51:51 +00003989 DerivedToBase = false;
3990 ObjCConversion = false;
John McCallf85e1932011-06-15 23:02:42 +00003991 ObjCLifetimeConversion = false;
Douglas Gregor569c3162010-08-07 11:51:51 +00003992 if (UnqualT1 == UnqualT2) {
3993 // Nothing to do.
Douglas Gregord10099e2012-05-04 16:32:21 +00003994 } else if (!RequireCompleteType(Loc, OrigT2, 0) &&
Douglas Gregor0162c1c2013-03-26 23:36:30 +00003995 isTypeValid(UnqualT1) && isTypeValid(UnqualT2) &&
3996 IsDerivedFrom(UnqualT2, UnqualT1))
Douglas Gregorabe183d2010-04-13 16:31:36 +00003997 DerivedToBase = true;
Douglas Gregor569c3162010-08-07 11:51:51 +00003998 else if (UnqualT1->isObjCObjectOrInterfaceType() &&
3999 UnqualT2->isObjCObjectOrInterfaceType() &&
4000 Context.canBindObjCObjectType(UnqualT1, UnqualT2))
4001 ObjCConversion = true;
Douglas Gregorabe183d2010-04-13 16:31:36 +00004002 else
4003 return Ref_Incompatible;
4004
4005 // At this point, we know that T1 and T2 are reference-related (at
4006 // least).
4007
4008 // If the type is an array type, promote the element qualifiers to the type
4009 // for comparison.
4010 if (isa<ArrayType>(T1) && T1Quals)
4011 T1 = Context.getQualifiedType(UnqualT1, T1Quals);
4012 if (isa<ArrayType>(T2) && T2Quals)
4013 T2 = Context.getQualifiedType(UnqualT2, T2Quals);
4014
4015 // C++ [dcl.init.ref]p4:
4016 // "cv1 T1" is reference-compatible with "cv2 T2" if T1 is
4017 // reference-related to T2 and cv1 is the same cv-qualification
4018 // as, or greater cv-qualification than, cv2. For purposes of
4019 // overload resolution, cases for which cv1 is greater
4020 // cv-qualification than cv2 are identified as
4021 // reference-compatible with added qualification (see 13.3.3.2).
Douglas Gregora6ce3e62011-04-28 17:56:11 +00004022 //
4023 // Note that we also require equivalence of Objective-C GC and address-space
4024 // qualifiers when performing these computations, so that e.g., an int in
4025 // address space 1 is not reference-compatible with an int in address
4026 // space 2.
John McCallf85e1932011-06-15 23:02:42 +00004027 if (T1Quals.getObjCLifetime() != T2Quals.getObjCLifetime() &&
4028 T1Quals.compatiblyIncludesObjCLifetime(T2Quals)) {
4029 T1Quals.removeObjCLifetime();
4030 T2Quals.removeObjCLifetime();
4031 ObjCLifetimeConversion = true;
4032 }
4033
Douglas Gregora6ce3e62011-04-28 17:56:11 +00004034 if (T1Quals == T2Quals)
Douglas Gregorabe183d2010-04-13 16:31:36 +00004035 return Ref_Compatible;
John McCallf85e1932011-06-15 23:02:42 +00004036 else if (T1Quals.compatiblyIncludes(T2Quals))
Douglas Gregorabe183d2010-04-13 16:31:36 +00004037 return Ref_Compatible_With_Added_Qualification;
4038 else
4039 return Ref_Related;
4040}
4041
Douglas Gregor604eb652010-08-11 02:15:33 +00004042/// \brief Look for a user-defined conversion to an value reference-compatible
Sebastian Redl4680bf22010-06-30 18:13:39 +00004043/// with DeclType. Return true if something definite is found.
4044static bool
Douglas Gregor604eb652010-08-11 02:15:33 +00004045FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS,
4046 QualType DeclType, SourceLocation DeclLoc,
4047 Expr *Init, QualType T2, bool AllowRvalues,
4048 bool AllowExplicit) {
Sebastian Redl4680bf22010-06-30 18:13:39 +00004049 assert(T2->isRecordType() && "Can only find conversions of record types.");
4050 CXXRecordDecl *T2RecordDecl
4051 = dyn_cast<CXXRecordDecl>(T2->getAs<RecordType>()->getDecl());
4052
4053 OverloadCandidateSet CandidateSet(DeclLoc);
Argyrios Kyrtzidis9d295432012-11-28 03:56:09 +00004054 std::pair<CXXRecordDecl::conversion_iterator,
4055 CXXRecordDecl::conversion_iterator>
4056 Conversions = T2RecordDecl->getVisibleConversionFunctions();
4057 for (CXXRecordDecl::conversion_iterator
4058 I = Conversions.first, E = Conversions.second; I != E; ++I) {
Sebastian Redl4680bf22010-06-30 18:13:39 +00004059 NamedDecl *D = *I;
4060 CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
4061 if (isa<UsingShadowDecl>(D))
4062 D = cast<UsingShadowDecl>(D)->getTargetDecl();
4063
4064 FunctionTemplateDecl *ConvTemplate
4065 = dyn_cast<FunctionTemplateDecl>(D);
4066 CXXConversionDecl *Conv;
4067 if (ConvTemplate)
4068 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4069 else
4070 Conv = cast<CXXConversionDecl>(D);
4071
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004072 // If this is an explicit conversion, and we're not allowed to consider
Douglas Gregor604eb652010-08-11 02:15:33 +00004073 // explicit conversions, skip it.
4074 if (!AllowExplicit && Conv->isExplicit())
4075 continue;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004076
Douglas Gregor604eb652010-08-11 02:15:33 +00004077 if (AllowRvalues) {
4078 bool DerivedToBase = false;
4079 bool ObjCConversion = false;
John McCallf85e1932011-06-15 23:02:42 +00004080 bool ObjCLifetimeConversion = false;
Douglas Gregor203050c2011-10-04 23:59:32 +00004081
4082 // If we are initializing an rvalue reference, don't permit conversion
4083 // functions that return lvalues.
4084 if (!ConvTemplate && DeclType->isRValueReferenceType()) {
4085 const ReferenceType *RefType
4086 = Conv->getConversionType()->getAs<LValueReferenceType>();
4087 if (RefType && !RefType->getPointeeType()->isFunctionType())
4088 continue;
4089 }
4090
Douglas Gregor604eb652010-08-11 02:15:33 +00004091 if (!ConvTemplate &&
Chandler Carruth6df868e2010-12-12 08:17:55 +00004092 S.CompareReferenceRelationship(
4093 DeclLoc,
4094 Conv->getConversionType().getNonReferenceType()
4095 .getUnqualifiedType(),
4096 DeclType.getNonReferenceType().getUnqualifiedType(),
John McCallf85e1932011-06-15 23:02:42 +00004097 DerivedToBase, ObjCConversion, ObjCLifetimeConversion) ==
Chandler Carruth6df868e2010-12-12 08:17:55 +00004098 Sema::Ref_Incompatible)
Douglas Gregor604eb652010-08-11 02:15:33 +00004099 continue;
4100 } else {
4101 // If the conversion function doesn't return a reference type,
4102 // it can't be considered for this conversion. An rvalue reference
4103 // is only acceptable if its referencee is a function type.
4104
4105 const ReferenceType *RefType =
4106 Conv->getConversionType()->getAs<ReferenceType>();
4107 if (!RefType ||
4108 (!RefType->isLValueReferenceType() &&
4109 !RefType->getPointeeType()->isFunctionType()))
4110 continue;
Sebastian Redl4680bf22010-06-30 18:13:39 +00004111 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004112
Douglas Gregor604eb652010-08-11 02:15:33 +00004113 if (ConvTemplate)
4114 S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), ActingDC,
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004115 Init, DeclType, CandidateSet);
Douglas Gregor604eb652010-08-11 02:15:33 +00004116 else
4117 S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Init,
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004118 DeclType, CandidateSet);
Sebastian Redl4680bf22010-06-30 18:13:39 +00004119 }
4120
Abramo Bagnara7cc58b42011-10-05 07:56:41 +00004121 bool HadMultipleCandidates = (CandidateSet.size() > 1);
4122
Sebastian Redl4680bf22010-06-30 18:13:39 +00004123 OverloadCandidateSet::iterator Best;
Douglas Gregor8fcc5162010-09-12 08:07:23 +00004124 switch (CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) {
Sebastian Redl4680bf22010-06-30 18:13:39 +00004125 case OR_Success:
4126 // C++ [over.ics.ref]p1:
4127 //
4128 // [...] If the parameter binds directly to the result of
4129 // applying a conversion function to the argument
4130 // expression, the implicit conversion sequence is a
4131 // user-defined conversion sequence (13.3.3.1.2), with the
4132 // second standard conversion sequence either an identity
4133 // conversion or, if the conversion function returns an
4134 // entity of a type that is a derived class of the parameter
4135 // type, a derived-to-base Conversion.
4136 if (!Best->FinalConversion.DirectBinding)
4137 return false;
4138
4139 ICS.setUserDefined();
4140 ICS.UserDefined.Before = Best->Conversions[0].Standard;
4141 ICS.UserDefined.After = Best->FinalConversion;
Abramo Bagnara7cc58b42011-10-05 07:56:41 +00004142 ICS.UserDefined.HadMultipleCandidates = HadMultipleCandidates;
Sebastian Redl4680bf22010-06-30 18:13:39 +00004143 ICS.UserDefined.ConversionFunction = Best->Function;
John McCallca82a822011-09-21 08:36:56 +00004144 ICS.UserDefined.FoundConversionFunction = Best->FoundDecl;
Sebastian Redl4680bf22010-06-30 18:13:39 +00004145 ICS.UserDefined.EllipsisConversion = false;
4146 assert(ICS.UserDefined.After.ReferenceBinding &&
4147 ICS.UserDefined.After.DirectBinding &&
4148 "Expected a direct reference binding!");
4149 return true;
4150
4151 case OR_Ambiguous:
4152 ICS.setAmbiguous();
4153 for (OverloadCandidateSet::iterator Cand = CandidateSet.begin();
4154 Cand != CandidateSet.end(); ++Cand)
4155 if (Cand->Viable)
4156 ICS.Ambiguous.addConversion(Cand->Function);
4157 return true;
4158
4159 case OR_No_Viable_Function:
4160 case OR_Deleted:
4161 // There was no suitable conversion, or we found a deleted
4162 // conversion; continue with other checks.
4163 return false;
4164 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004165
David Blaikie7530c032012-01-17 06:56:22 +00004166 llvm_unreachable("Invalid OverloadResult!");
Sebastian Redl4680bf22010-06-30 18:13:39 +00004167}
4168
Douglas Gregorabe183d2010-04-13 16:31:36 +00004169/// \brief Compute an implicit conversion sequence for reference
4170/// initialization.
4171static ImplicitConversionSequence
Sebastian Redl1cdb70b2011-12-03 14:54:30 +00004172TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
Douglas Gregorabe183d2010-04-13 16:31:36 +00004173 SourceLocation DeclLoc,
4174 bool SuppressUserConversions,
Douglas Gregor23ef6c02010-04-16 17:45:54 +00004175 bool AllowExplicit) {
Douglas Gregorabe183d2010-04-13 16:31:36 +00004176 assert(DeclType->isReferenceType() && "Reference init needs a reference");
4177
4178 // Most paths end in a failed conversion.
4179 ImplicitConversionSequence ICS;
4180 ICS.setBad(BadConversionSequence::no_conversion, Init, DeclType);
4181
4182 QualType T1 = DeclType->getAs<ReferenceType>()->getPointeeType();
4183 QualType T2 = Init->getType();
4184
4185 // If the initializer is the address of an overloaded function, try
4186 // to resolve the overloaded function. If all goes well, T2 is the
4187 // type of the resulting function.
4188 if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) {
4189 DeclAccessPair Found;
4190 if (FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction(Init, DeclType,
4191 false, Found))
4192 T2 = Fn->getType();
4193 }
4194
4195 // Compute some basic properties of the types and the initializer.
4196 bool isRValRef = DeclType->isRValueReferenceType();
4197 bool DerivedToBase = false;
Douglas Gregor569c3162010-08-07 11:51:51 +00004198 bool ObjCConversion = false;
John McCallf85e1932011-06-15 23:02:42 +00004199 bool ObjCLifetimeConversion = false;
Sebastian Redl4680bf22010-06-30 18:13:39 +00004200 Expr::Classification InitCategory = Init->Classify(S.Context);
Douglas Gregorabe183d2010-04-13 16:31:36 +00004201 Sema::ReferenceCompareResult RefRelationship
Douglas Gregor569c3162010-08-07 11:51:51 +00004202 = S.CompareReferenceRelationship(DeclLoc, T1, T2, DerivedToBase,
John McCallf85e1932011-06-15 23:02:42 +00004203 ObjCConversion, ObjCLifetimeConversion);
Douglas Gregorabe183d2010-04-13 16:31:36 +00004204
Douglas Gregorabe183d2010-04-13 16:31:36 +00004205
Sebastian Redl4680bf22010-06-30 18:13:39 +00004206 // C++0x [dcl.init.ref]p5:
Douglas Gregor66821b52010-04-18 09:22:00 +00004207 // A reference to type "cv1 T1" is initialized by an expression
4208 // of type "cv2 T2" as follows:
4209
Sebastian Redl4680bf22010-06-30 18:13:39 +00004210 // -- If reference is an lvalue reference and the initializer expression
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004211 if (!isRValRef) {
Sebastian Redl4680bf22010-06-30 18:13:39 +00004212 // -- is an lvalue (but is not a bit-field), and "cv1 T1" is
4213 // reference-compatible with "cv2 T2," or
4214 //
4215 // Per C++ [over.ics.ref]p4, we don't check the bit-field property here.
4216 if (InitCategory.isLValue() &&
4217 RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) {
Douglas Gregorabe183d2010-04-13 16:31:36 +00004218 // C++ [over.ics.ref]p1:
Sebastian Redl4680bf22010-06-30 18:13:39 +00004219 // When a parameter of reference type binds directly (8.5.3)
4220 // to an argument expression, the implicit conversion sequence
4221 // is the identity conversion, unless the argument expression
4222 // has a type that is a derived class of the parameter type,
4223 // in which case the implicit conversion sequence is a
4224 // derived-to-base Conversion (13.3.3.1).
4225 ICS.setStandard();
4226 ICS.Standard.First = ICK_Identity;
Douglas Gregor569c3162010-08-07 11:51:51 +00004227 ICS.Standard.Second = DerivedToBase? ICK_Derived_To_Base
4228 : ObjCConversion? ICK_Compatible_Conversion
4229 : ICK_Identity;
Sebastian Redl4680bf22010-06-30 18:13:39 +00004230 ICS.Standard.Third = ICK_Identity;
4231 ICS.Standard.FromTypePtr = T2.getAsOpaquePtr();
4232 ICS.Standard.setToType(0, T2);
4233 ICS.Standard.setToType(1, T1);
4234 ICS.Standard.setToType(2, T1);
4235 ICS.Standard.ReferenceBinding = true;
4236 ICS.Standard.DirectBinding = true;
Douglas Gregor440a4832011-01-26 14:52:12 +00004237 ICS.Standard.IsLvalueReference = !isRValRef;
4238 ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
4239 ICS.Standard.BindsToRvalue = false;
Douglas Gregorfcab48b2011-01-26 19:41:18 +00004240 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
John McCallf85e1932011-06-15 23:02:42 +00004241 ICS.Standard.ObjCLifetimeConversionBinding = ObjCLifetimeConversion;
Sebastian Redl4680bf22010-06-30 18:13:39 +00004242 ICS.Standard.CopyConstructor = 0;
Douglas Gregorabe183d2010-04-13 16:31:36 +00004243
Sebastian Redl4680bf22010-06-30 18:13:39 +00004244 // Nothing more to do: the inaccessibility/ambiguity check for
4245 // derived-to-base conversions is suppressed when we're
4246 // computing the implicit conversion sequence (C++
4247 // [over.best.ics]p2).
Douglas Gregorabe183d2010-04-13 16:31:36 +00004248 return ICS;
Sebastian Redl4680bf22010-06-30 18:13:39 +00004249 }
Douglas Gregorabe183d2010-04-13 16:31:36 +00004250
Sebastian Redl4680bf22010-06-30 18:13:39 +00004251 // -- has a class type (i.e., T2 is a class type), where T1 is
4252 // not reference-related to T2, and can be implicitly
4253 // converted to an lvalue of type "cv3 T3," where "cv1 T1"
4254 // is reference-compatible with "cv3 T3" 92) (this
4255 // conversion is selected by enumerating the applicable
4256 // conversion functions (13.3.1.6) and choosing the best
4257 // one through overload resolution (13.3)),
4258 if (!SuppressUserConversions && T2->isRecordType() &&
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004259 !S.RequireCompleteType(DeclLoc, T2, 0) &&
Sebastian Redl4680bf22010-06-30 18:13:39 +00004260 RefRelationship == Sema::Ref_Incompatible) {
Douglas Gregor604eb652010-08-11 02:15:33 +00004261 if (FindConversionForRefInit(S, ICS, DeclType, DeclLoc,
4262 Init, T2, /*AllowRvalues=*/false,
4263 AllowExplicit))
Sebastian Redl4680bf22010-06-30 18:13:39 +00004264 return ICS;
Douglas Gregorabe183d2010-04-13 16:31:36 +00004265 }
4266 }
4267
Sebastian Redl4680bf22010-06-30 18:13:39 +00004268 // -- Otherwise, the reference shall be an lvalue reference to a
4269 // non-volatile const type (i.e., cv1 shall be const), or the reference
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004270 // shall be an rvalue reference.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004271 //
Douglas Gregor66821b52010-04-18 09:22:00 +00004272 // We actually handle one oddity of C++ [over.ics.ref] at this
4273 // point, which is that, due to p2 (which short-circuits reference
4274 // binding by only attempting a simple conversion for non-direct
4275 // bindings) and p3's strange wording, we allow a const volatile
4276 // reference to bind to an rvalue. Hence the check for the presence
4277 // of "const" rather than checking for "const" being the only
4278 // qualifier.
Sebastian Redl4680bf22010-06-30 18:13:39 +00004279 // This is also the point where rvalue references and lvalue inits no longer
4280 // go together.
Richard Smith8ab10aa2012-05-24 04:29:20 +00004281 if (!isRValRef && (!T1.isConstQualified() || T1.isVolatileQualified()))
Douglas Gregorabe183d2010-04-13 16:31:36 +00004282 return ICS;
4283
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004284 // -- If the initializer expression
4285 //
4286 // -- is an xvalue, class prvalue, array prvalue or function
John McCallf85e1932011-06-15 23:02:42 +00004287 // lvalue and "cv1 T1" is reference-compatible with "cv2 T2", or
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004288 if (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification &&
4289 (InitCategory.isXValue() ||
4290 (InitCategory.isPRValue() && (T2->isRecordType() || T2->isArrayType())) ||
4291 (InitCategory.isLValue() && T2->isFunctionType()))) {
4292 ICS.setStandard();
4293 ICS.Standard.First = ICK_Identity;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004294 ICS.Standard.Second = DerivedToBase? ICK_Derived_To_Base
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004295 : ObjCConversion? ICK_Compatible_Conversion
4296 : ICK_Identity;
4297 ICS.Standard.Third = ICK_Identity;
4298 ICS.Standard.FromTypePtr = T2.getAsOpaquePtr();
4299 ICS.Standard.setToType(0, T2);
4300 ICS.Standard.setToType(1, T1);
4301 ICS.Standard.setToType(2, T1);
4302 ICS.Standard.ReferenceBinding = true;
4303 // In C++0x, this is always a direct binding. In C++98/03, it's a direct
4304 // binding unless we're binding to a class prvalue.
4305 // Note: Although xvalues wouldn't normally show up in C++98/03 code, we
4306 // allow the use of rvalue references in C++98/03 for the benefit of
4307 // standard library implementors; therefore, we need the xvalue check here.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004308 ICS.Standard.DirectBinding =
Richard Smith80ad52f2013-01-02 11:42:31 +00004309 S.getLangOpts().CPlusPlus11 ||
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004310 (InitCategory.isPRValue() && !T2->isRecordType());
Douglas Gregor440a4832011-01-26 14:52:12 +00004311 ICS.Standard.IsLvalueReference = !isRValRef;
4312 ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004313 ICS.Standard.BindsToRvalue = InitCategory.isRValue();
Douglas Gregorfcab48b2011-01-26 19:41:18 +00004314 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
John McCallf85e1932011-06-15 23:02:42 +00004315 ICS.Standard.ObjCLifetimeConversionBinding = ObjCLifetimeConversion;
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004316 ICS.Standard.CopyConstructor = 0;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004317 return ICS;
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004318 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004319
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004320 // -- has a class type (i.e., T2 is a class type), where T1 is not
4321 // reference-related to T2, and can be implicitly converted to
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004322 // an xvalue, class prvalue, or function lvalue of type
4323 // "cv3 T3", where "cv1 T1" is reference-compatible with
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004324 // "cv3 T3",
4325 //
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004326 // then the reference is bound to the value of the initializer
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004327 // expression in the first case and to the result of the conversion
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004328 // in the second case (or, in either case, to an appropriate base
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004329 // class subobject).
4330 if (!SuppressUserConversions && RefRelationship == Sema::Ref_Incompatible &&
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004331 T2->isRecordType() && !S.RequireCompleteType(DeclLoc, T2, 0) &&
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004332 FindConversionForRefInit(S, ICS, DeclType, DeclLoc,
4333 Init, T2, /*AllowRvalues=*/true,
4334 AllowExplicit)) {
4335 // In the second case, if the reference is an rvalue reference
4336 // and the second standard conversion sequence of the
4337 // user-defined conversion sequence includes an lvalue-to-rvalue
4338 // conversion, the program is ill-formed.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004339 if (ICS.isUserDefined() && isRValRef &&
Douglas Gregor8dde14e2011-01-24 16:14:37 +00004340 ICS.UserDefined.After.First == ICK_Lvalue_To_Rvalue)
4341 ICS.setBad(BadConversionSequence::no_conversion, Init, DeclType);
4342
Douglas Gregor68ed68b2011-01-21 16:36:05 +00004343 return ICS;
Rafael Espindolaaa5952c2011-01-22 15:32:35 +00004344 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004345
Douglas Gregorabe183d2010-04-13 16:31:36 +00004346 // -- Otherwise, a temporary of type "cv1 T1" is created and
4347 // initialized from the initializer expression using the
4348 // rules for a non-reference copy initialization (8.5). The
4349 // reference is then bound to the temporary. If T1 is
4350 // reference-related to T2, cv1 must be the same
4351 // cv-qualification as, or greater cv-qualification than,
4352 // cv2; otherwise, the program is ill-formed.
4353 if (RefRelationship == Sema::Ref_Related) {
4354 // If cv1 == cv2 or cv1 is a greater cv-qualified than cv2, then
4355 // we would be reference-compatible or reference-compatible with
4356 // added qualification. But that wasn't the case, so the reference
4357 // initialization fails.
John McCallf85e1932011-06-15 23:02:42 +00004358 //
4359 // Note that we only want to check address spaces and cvr-qualifiers here.
4360 // ObjC GC and lifetime qualifiers aren't important.
4361 Qualifiers T1Quals = T1.getQualifiers();
4362 Qualifiers T2Quals = T2.getQualifiers();
4363 T1Quals.removeObjCGCAttr();
4364 T1Quals.removeObjCLifetime();
4365 T2Quals.removeObjCGCAttr();
4366 T2Quals.removeObjCLifetime();
4367 if (!T1Quals.compatiblyIncludes(T2Quals))
4368 return ICS;
Douglas Gregorabe183d2010-04-13 16:31:36 +00004369 }
4370
4371 // If at least one of the types is a class type, the types are not
4372 // related, and we aren't allowed any user conversions, the
4373 // reference binding fails. This case is important for breaking
4374 // recursion, since TryImplicitConversion below will attempt to
4375 // create a temporary through the use of a copy constructor.
4376 if (SuppressUserConversions && RefRelationship == Sema::Ref_Incompatible &&
4377 (T1->isRecordType() || T2->isRecordType()))
4378 return ICS;
4379
Douglas Gregor2ad746a2011-01-21 05:18:22 +00004380 // If T1 is reference-related to T2 and the reference is an rvalue
4381 // reference, the initializer expression shall not be an lvalue.
4382 if (RefRelationship >= Sema::Ref_Related &&
4383 isRValRef && Init->Classify(S.Context).isLValue())
4384 return ICS;
4385
Douglas Gregorabe183d2010-04-13 16:31:36 +00004386 // C++ [over.ics.ref]p2:
Douglas Gregorabe183d2010-04-13 16:31:36 +00004387 // When a parameter of reference type is not bound directly to
4388 // an argument expression, the conversion sequence is the one
4389 // required to convert the argument expression to the
4390 // underlying type of the reference according to
4391 // 13.3.3.1. Conceptually, this conversion sequence corresponds
4392 // to copy-initializing a temporary of the underlying type with
4393 // the argument expression. Any difference in top-level
4394 // cv-qualification is subsumed by the initialization itself
4395 // and does not constitute a conversion.
John McCall120d63c2010-08-24 20:38:10 +00004396 ICS = TryImplicitConversion(S, Init, T1, SuppressUserConversions,
4397 /*AllowExplicit=*/false,
Douglas Gregor14d0aee2011-01-27 00:58:17 +00004398 /*InOverloadResolution=*/false,
John McCallf85e1932011-06-15 23:02:42 +00004399 /*CStyle=*/false,
4400 /*AllowObjCWritebackConversion=*/false);
Douglas Gregorabe183d2010-04-13 16:31:36 +00004401
4402 // Of course, that's still a reference binding.
4403 if (ICS.isStandard()) {
4404 ICS.Standard.ReferenceBinding = true;
Douglas Gregor440a4832011-01-26 14:52:12 +00004405 ICS.Standard.IsLvalueReference = !isRValRef;
4406 ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
4407 ICS.Standard.BindsToRvalue = true;
Douglas Gregorfcab48b2011-01-26 19:41:18 +00004408 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
John McCallf85e1932011-06-15 23:02:42 +00004409 ICS.Standard.ObjCLifetimeConversionBinding = false;
Douglas Gregorabe183d2010-04-13 16:31:36 +00004410 } else if (ICS.isUserDefined()) {
Douglas Gregor203050c2011-10-04 23:59:32 +00004411 // Don't allow rvalue references to bind to lvalues.
4412 if (DeclType->isRValueReferenceType()) {
4413 if (const ReferenceType *RefType
4414 = ICS.UserDefined.ConversionFunction->getResultType()
4415 ->getAs<LValueReferenceType>()) {
4416 if (!RefType->getPointeeType()->isFunctionType()) {
4417 ICS.setBad(BadConversionSequence::lvalue_ref_to_rvalue, Init,
4418 DeclType);
4419 return ICS;
4420 }
4421 }
4422 }
4423
Douglas Gregorabe183d2010-04-13 16:31:36 +00004424 ICS.UserDefined.After.ReferenceBinding = true;
Douglas Gregorf20d2722011-08-15 13:59:46 +00004425 ICS.UserDefined.After.IsLvalueReference = !isRValRef;
4426 ICS.UserDefined.After.BindsToFunctionLvalue = T2->isFunctionType();
4427 ICS.UserDefined.After.BindsToRvalue = true;
4428 ICS.UserDefined.After.BindsImplicitObjectArgumentWithoutRefQualifier = false;
4429 ICS.UserDefined.After.ObjCLifetimeConversionBinding = false;
Douglas Gregorabe183d2010-04-13 16:31:36 +00004430 }
Douglas Gregor2ad746a2011-01-21 05:18:22 +00004431
Douglas Gregorabe183d2010-04-13 16:31:36 +00004432 return ICS;
4433}
4434
Sebastian Redl5405b812011-10-16 18:19:34 +00004435static ImplicitConversionSequence
4436TryCopyInitialization(Sema &S, Expr *From, QualType ToType,
4437 bool SuppressUserConversions,
4438 bool InOverloadResolution,
Douglas Gregored878af2012-02-24 23:56:31 +00004439 bool AllowObjCWritebackConversion,
4440 bool AllowExplicit = false);
Sebastian Redl5405b812011-10-16 18:19:34 +00004441
4442/// TryListConversion - Try to copy-initialize a value of type ToType from the
4443/// initializer list From.
4444static ImplicitConversionSequence
4445TryListConversion(Sema &S, InitListExpr *From, QualType ToType,
4446 bool SuppressUserConversions,
4447 bool InOverloadResolution,
4448 bool AllowObjCWritebackConversion) {
4449 // C++11 [over.ics.list]p1:
4450 // When an argument is an initializer list, it is not an expression and
4451 // special rules apply for converting it to a parameter type.
4452
4453 ImplicitConversionSequence Result;
4454 Result.setBad(BadConversionSequence::no_conversion, From, ToType);
Sebastian Redlcc7a6482011-11-01 15:53:09 +00004455 Result.setListInitializationSequence();
Sebastian Redl5405b812011-10-16 18:19:34 +00004456
Sebastian Redlb832f6d2012-01-23 22:09:39 +00004457 // We need a complete type for what follows. Incomplete types can never be
Sebastian Redlfe592282012-01-17 22:49:48 +00004458 // initialized from init lists.
Douglas Gregord10099e2012-05-04 16:32:21 +00004459 if (S.RequireCompleteType(From->getLocStart(), ToType, 0))
Sebastian Redlfe592282012-01-17 22:49:48 +00004460 return Result;
4461
Sebastian Redl5405b812011-10-16 18:19:34 +00004462 // C++11 [over.ics.list]p2:
4463 // If the parameter type is std::initializer_list<X> or "array of X" and
4464 // all the elements can be implicitly converted to X, the implicit
4465 // conversion sequence is the worst conversion necessary to convert an
4466 // element of the list to X.
Sebastian Redladfb5352012-02-27 22:38:26 +00004467 bool toStdInitializerList = false;
Sebastian Redlfe592282012-01-17 22:49:48 +00004468 QualType X;
Sebastian Redl5405b812011-10-16 18:19:34 +00004469 if (ToType->isArrayType())
Richard Smith2801d9a2012-12-09 06:48:56 +00004470 X = S.Context.getAsArrayType(ToType)->getElementType();
Sebastian Redlfe592282012-01-17 22:49:48 +00004471 else
Sebastian Redladfb5352012-02-27 22:38:26 +00004472 toStdInitializerList = S.isStdInitializerList(ToType, &X);
Sebastian Redlfe592282012-01-17 22:49:48 +00004473 if (!X.isNull()) {
4474 for (unsigned i = 0, e = From->getNumInits(); i < e; ++i) {
4475 Expr *Init = From->getInit(i);
4476 ImplicitConversionSequence ICS =
4477 TryCopyInitialization(S, Init, X, SuppressUserConversions,
4478 InOverloadResolution,
4479 AllowObjCWritebackConversion);
4480 // If a single element isn't convertible, fail.
4481 if (ICS.isBad()) {
4482 Result = ICS;
4483 break;
4484 }
4485 // Otherwise, look for the worst conversion.
4486 if (Result.isBad() ||
4487 CompareImplicitConversionSequences(S, ICS, Result) ==
4488 ImplicitConversionSequence::Worse)
4489 Result = ICS;
4490 }
Douglas Gregor5b4bf132012-04-04 23:09:20 +00004491
4492 // For an empty list, we won't have computed any conversion sequence.
4493 // Introduce the identity conversion sequence.
4494 if (From->getNumInits() == 0) {
4495 Result.setStandard();
4496 Result.Standard.setAsIdentityConversion();
4497 Result.Standard.setFromType(ToType);
4498 Result.Standard.setAllToTypes(ToType);
4499 }
4500
Sebastian Redlfe592282012-01-17 22:49:48 +00004501 Result.setListInitializationSequence();
Sebastian Redladfb5352012-02-27 22:38:26 +00004502 Result.setStdInitializerListElement(toStdInitializerList);
Sebastian Redl5405b812011-10-16 18:19:34 +00004503 return Result;
Sebastian Redlfe592282012-01-17 22:49:48 +00004504 }
Sebastian Redl5405b812011-10-16 18:19:34 +00004505
4506 // C++11 [over.ics.list]p3:
4507 // Otherwise, if the parameter is a non-aggregate class X and overload
4508 // resolution chooses a single best constructor [...] the implicit
4509 // conversion sequence is a user-defined conversion sequence. If multiple
4510 // constructors are viable but none is better than the others, the
4511 // implicit conversion sequence is a user-defined conversion sequence.
Sebastian Redlcf15cef2011-12-22 18:58:38 +00004512 if (ToType->isRecordType() && !ToType->isAggregateType()) {
4513 // This function can deal with initializer lists.
4514 Result = TryUserDefinedConversion(S, From, ToType, SuppressUserConversions,
4515 /*AllowExplicit=*/false,
4516 InOverloadResolution, /*CStyle=*/false,
4517 AllowObjCWritebackConversion);
4518 Result.setListInitializationSequence();
Sebastian Redl5405b812011-10-16 18:19:34 +00004519 return Result;
Sebastian Redlcf15cef2011-12-22 18:58:38 +00004520 }
Sebastian Redl5405b812011-10-16 18:19:34 +00004521
4522 // C++11 [over.ics.list]p4:
4523 // Otherwise, if the parameter has an aggregate type which can be
4524 // initialized from the initializer list [...] the implicit conversion
4525 // sequence is a user-defined conversion sequence.
Sebastian Redl5405b812011-10-16 18:19:34 +00004526 if (ToType->isAggregateType()) {
Sebastian Redlcc7a6482011-11-01 15:53:09 +00004527 // Type is an aggregate, argument is an init list. At this point it comes
4528 // down to checking whether the initialization works.
4529 // FIXME: Find out whether this parameter is consumed or not.
4530 InitializedEntity Entity =
4531 InitializedEntity::InitializeParameter(S.Context, ToType,
4532 /*Consumed=*/false);
4533 if (S.CanPerformCopyInitialization(Entity, S.Owned(From))) {
4534 Result.setUserDefined();
4535 Result.UserDefined.Before.setAsIdentityConversion();
4536 // Initializer lists don't have a type.
4537 Result.UserDefined.Before.setFromType(QualType());
4538 Result.UserDefined.Before.setAllToTypes(QualType());
4539
4540 Result.UserDefined.After.setAsIdentityConversion();
4541 Result.UserDefined.After.setFromType(ToType);
4542 Result.UserDefined.After.setAllToTypes(ToType);
Benjamin Kramer83db10e2012-02-02 19:35:29 +00004543 Result.UserDefined.ConversionFunction = 0;
Sebastian Redlcc7a6482011-11-01 15:53:09 +00004544 }
Sebastian Redl5405b812011-10-16 18:19:34 +00004545 return Result;
4546 }
4547
4548 // C++11 [over.ics.list]p5:
4549 // Otherwise, if the parameter is a reference, see 13.3.3.1.4.
Sebastian Redl1cdb70b2011-12-03 14:54:30 +00004550 if (ToType->isReferenceType()) {
4551 // The standard is notoriously unclear here, since 13.3.3.1.4 doesn't
4552 // mention initializer lists in any way. So we go by what list-
4553 // initialization would do and try to extrapolate from that.
4554
4555 QualType T1 = ToType->getAs<ReferenceType>()->getPointeeType();
4556
4557 // If the initializer list has a single element that is reference-related
4558 // to the parameter type, we initialize the reference from that.
4559 if (From->getNumInits() == 1) {
4560 Expr *Init = From->getInit(0);
4561
4562 QualType T2 = Init->getType();
4563
4564 // If the initializer is the address of an overloaded function, try
4565 // to resolve the overloaded function. If all goes well, T2 is the
4566 // type of the resulting function.
4567 if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) {
4568 DeclAccessPair Found;
4569 if (FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction(
4570 Init, ToType, false, Found))
4571 T2 = Fn->getType();
4572 }
4573
4574 // Compute some basic properties of the types and the initializer.
4575 bool dummy1 = false;
4576 bool dummy2 = false;
4577 bool dummy3 = false;
4578 Sema::ReferenceCompareResult RefRelationship
4579 = S.CompareReferenceRelationship(From->getLocStart(), T1, T2, dummy1,
4580 dummy2, dummy3);
4581
4582 if (RefRelationship >= Sema::Ref_Related)
4583 return TryReferenceInit(S, Init, ToType,
4584 /*FIXME:*/From->getLocStart(),
4585 SuppressUserConversions,
4586 /*AllowExplicit=*/false);
4587 }
4588
4589 // Otherwise, we bind the reference to a temporary created from the
4590 // initializer list.
4591 Result = TryListConversion(S, From, T1, SuppressUserConversions,
4592 InOverloadResolution,
4593 AllowObjCWritebackConversion);
4594 if (Result.isFailure())
4595 return Result;
4596 assert(!Result.isEllipsis() &&
4597 "Sub-initialization cannot result in ellipsis conversion.");
4598
4599 // Can we even bind to a temporary?
4600 if (ToType->isRValueReferenceType() ||
4601 (T1.isConstQualified() && !T1.isVolatileQualified())) {
4602 StandardConversionSequence &SCS = Result.isStandard() ? Result.Standard :
4603 Result.UserDefined.After;
4604 SCS.ReferenceBinding = true;
4605 SCS.IsLvalueReference = ToType->isLValueReferenceType();
4606 SCS.BindsToRvalue = true;
4607 SCS.BindsToFunctionLvalue = false;
4608 SCS.BindsImplicitObjectArgumentWithoutRefQualifier = false;
4609 SCS.ObjCLifetimeConversionBinding = false;
4610 } else
4611 Result.setBad(BadConversionSequence::lvalue_ref_to_rvalue,
4612 From, ToType);
Sebastian Redl5405b812011-10-16 18:19:34 +00004613 return Result;
Sebastian Redl1cdb70b2011-12-03 14:54:30 +00004614 }
Sebastian Redl5405b812011-10-16 18:19:34 +00004615
4616 // C++11 [over.ics.list]p6:
4617 // Otherwise, if the parameter type is not a class:
4618 if (!ToType->isRecordType()) {
4619 // - if the initializer list has one element, the implicit conversion
4620 // sequence is the one required to convert the element to the
4621 // parameter type.
Sebastian Redl5405b812011-10-16 18:19:34 +00004622 unsigned NumInits = From->getNumInits();
4623 if (NumInits == 1)
4624 Result = TryCopyInitialization(S, From->getInit(0), ToType,
4625 SuppressUserConversions,
4626 InOverloadResolution,
4627 AllowObjCWritebackConversion);
4628 // - if the initializer list has no elements, the implicit conversion
4629 // sequence is the identity conversion.
4630 else if (NumInits == 0) {
4631 Result.setStandard();
4632 Result.Standard.setAsIdentityConversion();
John McCalle14ba2c2012-04-04 02:40:27 +00004633 Result.Standard.setFromType(ToType);
4634 Result.Standard.setAllToTypes(ToType);
Sebastian Redl5405b812011-10-16 18:19:34 +00004635 }
Sebastian Redl2422e822012-02-28 23:36:38 +00004636 Result.setListInitializationSequence();
Sebastian Redl5405b812011-10-16 18:19:34 +00004637 return Result;
4638 }
4639
4640 // C++11 [over.ics.list]p7:
4641 // In all cases other than those enumerated above, no conversion is possible
4642 return Result;
4643}
4644
Douglas Gregor27c8dc02008-10-29 00:13:59 +00004645/// TryCopyInitialization - Try to copy-initialize a value of type
4646/// ToType from the expression From. Return the implicit conversion
4647/// sequence required to pass this argument, which may be a bad
4648/// conversion sequence (meaning that the argument cannot be passed to
Douglas Gregor225c41e2008-11-03 19:09:14 +00004649/// a parameter of this type). If @p SuppressUserConversions, then we
Douglas Gregor74e386e2010-04-16 18:00:29 +00004650/// do not permit any user-defined conversion sequences.
Douglas Gregor74eb6582010-04-16 17:51:22 +00004651static ImplicitConversionSequence
4652TryCopyInitialization(Sema &S, Expr *From, QualType ToType,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004653 bool SuppressUserConversions,
John McCallf85e1932011-06-15 23:02:42 +00004654 bool InOverloadResolution,
Douglas Gregored878af2012-02-24 23:56:31 +00004655 bool AllowObjCWritebackConversion,
4656 bool AllowExplicit) {
Sebastian Redl5405b812011-10-16 18:19:34 +00004657 if (InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
4658 return TryListConversion(S, FromInitList, ToType, SuppressUserConversions,
4659 InOverloadResolution,AllowObjCWritebackConversion);
4660
Douglas Gregorabe183d2010-04-13 16:31:36 +00004661 if (ToType->isReferenceType())
Douglas Gregor74eb6582010-04-16 17:51:22 +00004662 return TryReferenceInit(S, From, ToType,
Douglas Gregorabe183d2010-04-13 16:31:36 +00004663 /*FIXME:*/From->getLocStart(),
4664 SuppressUserConversions,
Douglas Gregored878af2012-02-24 23:56:31 +00004665 AllowExplicit);
Douglas Gregorabe183d2010-04-13 16:31:36 +00004666
John McCall120d63c2010-08-24 20:38:10 +00004667 return TryImplicitConversion(S, From, ToType,
4668 SuppressUserConversions,
4669 /*AllowExplicit=*/false,
Douglas Gregor14d0aee2011-01-27 00:58:17 +00004670 InOverloadResolution,
John McCallf85e1932011-06-15 23:02:42 +00004671 /*CStyle=*/false,
4672 AllowObjCWritebackConversion);
Douglas Gregor27c8dc02008-10-29 00:13:59 +00004673}
4674
Anna Zaksf3546ee2011-07-28 19:46:48 +00004675static bool TryCopyInitialization(const CanQualType FromQTy,
4676 const CanQualType ToQTy,
4677 Sema &S,
4678 SourceLocation Loc,
4679 ExprValueKind FromVK) {
4680 OpaqueValueExpr TmpExpr(Loc, FromQTy, FromVK);
4681 ImplicitConversionSequence ICS =
4682 TryCopyInitialization(S, &TmpExpr, ToQTy, true, true, false);
4683
4684 return !ICS.isBad();
4685}
4686
Douglas Gregor96176b32008-11-18 23:14:02 +00004687/// TryObjectArgumentInitialization - Try to initialize the object
4688/// parameter of the given member function (@c Method) from the
4689/// expression @p From.
John McCall120d63c2010-08-24 20:38:10 +00004690static ImplicitConversionSequence
Richard Smith98bfbf52013-01-26 02:07:32 +00004691TryObjectArgumentInitialization(Sema &S, QualType FromType,
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004692 Expr::Classification FromClassification,
John McCall120d63c2010-08-24 20:38:10 +00004693 CXXMethodDecl *Method,
4694 CXXRecordDecl *ActingContext) {
4695 QualType ClassType = S.Context.getTypeDeclType(ActingContext);
Sebastian Redl65bdbfa2009-11-18 20:55:52 +00004696 // [class.dtor]p2: A destructor can be invoked for a const, volatile or
4697 // const volatile object.
4698 unsigned Quals = isa<CXXDestructorDecl>(Method) ?
4699 Qualifiers::Const | Qualifiers::Volatile : Method->getTypeQualifiers();
John McCall120d63c2010-08-24 20:38:10 +00004700 QualType ImplicitParamType = S.Context.getCVRQualifiedType(ClassType, Quals);
Douglas Gregor96176b32008-11-18 23:14:02 +00004701
4702 // Set up the conversion sequence as a "bad" conversion, to allow us
4703 // to exit early.
4704 ImplicitConversionSequence ICS;
Douglas Gregor96176b32008-11-18 23:14:02 +00004705
4706 // We need to have an object of class type.
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004707 if (const PointerType *PT = FromType->getAs<PointerType>()) {
Anders Carlssona552f7c2009-05-01 18:34:30 +00004708 FromType = PT->getPointeeType();
4709
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004710 // When we had a pointer, it's implicitly dereferenced, so we
4711 // better have an lvalue.
4712 assert(FromClassification.isLValue());
4713 }
4714
Anders Carlssona552f7c2009-05-01 18:34:30 +00004715 assert(FromType->isRecordType());
Douglas Gregor96176b32008-11-18 23:14:02 +00004716
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004717 // C++0x [over.match.funcs]p4:
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004718 // For non-static member functions, the type of the implicit object
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004719 // parameter is
4720 //
NAKAMURA Takumi00995302011-01-27 07:09:49 +00004721 // - "lvalue reference to cv X" for functions declared without a
4722 // ref-qualifier or with the & ref-qualifier
4723 // - "rvalue reference to cv X" for functions declared with the &&
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004724 // ref-qualifier
4725 //
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004726 // where X is the class of which the function is a member and cv is the
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004727 // cv-qualification on the member function declaration.
4728 //
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004729 // However, when finding an implicit conversion sequence for the argument, we
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004730 // are not allowed to create temporaries or perform user-defined conversions
Douglas Gregor96176b32008-11-18 23:14:02 +00004731 // (C++ [over.match.funcs]p5). We perform a simplified version of
4732 // reference binding here, that allows class rvalues to bind to
4733 // non-constant references.
4734
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004735 // First check the qualifiers.
John McCall120d63c2010-08-24 20:38:10 +00004736 QualType FromTypeCanon = S.Context.getCanonicalType(FromType);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004737 if (ImplicitParamType.getCVRQualifiers()
Douglas Gregora4923eb2009-11-16 21:35:15 +00004738 != FromTypeCanon.getLocalCVRQualifiers() &&
John McCalladbb8f82010-01-13 09:16:55 +00004739 !ImplicitParamType.isAtLeastAsQualifiedAs(FromTypeCanon)) {
John McCallb1bdc622010-02-25 01:37:24 +00004740 ICS.setBad(BadConversionSequence::bad_qualifiers,
Richard Smith98bfbf52013-01-26 02:07:32 +00004741 FromType, ImplicitParamType);
Douglas Gregor96176b32008-11-18 23:14:02 +00004742 return ICS;
John McCalladbb8f82010-01-13 09:16:55 +00004743 }
Douglas Gregor96176b32008-11-18 23:14:02 +00004744
4745 // Check that we have either the same type or a derived type. It
4746 // affects the conversion rank.
John McCall120d63c2010-08-24 20:38:10 +00004747 QualType ClassTypeCanon = S.Context.getCanonicalType(ClassType);
John McCallb1bdc622010-02-25 01:37:24 +00004748 ImplicitConversionKind SecondKind;
4749 if (ClassTypeCanon == FromTypeCanon.getLocalUnqualifiedType()) {
4750 SecondKind = ICK_Identity;
John McCall120d63c2010-08-24 20:38:10 +00004751 } else if (S.IsDerivedFrom(FromType, ClassType))
John McCallb1bdc622010-02-25 01:37:24 +00004752 SecondKind = ICK_Derived_To_Base;
John McCalladbb8f82010-01-13 09:16:55 +00004753 else {
John McCallb1bdc622010-02-25 01:37:24 +00004754 ICS.setBad(BadConversionSequence::unrelated_class,
4755 FromType, ImplicitParamType);
Douglas Gregor96176b32008-11-18 23:14:02 +00004756 return ICS;
John McCalladbb8f82010-01-13 09:16:55 +00004757 }
Douglas Gregor96176b32008-11-18 23:14:02 +00004758
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004759 // Check the ref-qualifier.
4760 switch (Method->getRefQualifier()) {
4761 case RQ_None:
4762 // Do nothing; we don't care about lvalueness or rvalueness.
4763 break;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004764
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004765 case RQ_LValue:
4766 if (!FromClassification.isLValue() && Quals != Qualifiers::Const) {
4767 // non-const lvalue reference cannot bind to an rvalue
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004768 ICS.setBad(BadConversionSequence::lvalue_ref_to_rvalue, FromType,
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004769 ImplicitParamType);
4770 return ICS;
4771 }
4772 break;
4773
4774 case RQ_RValue:
4775 if (!FromClassification.isRValue()) {
4776 // rvalue reference cannot bind to an lvalue
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004777 ICS.setBad(BadConversionSequence::rvalue_ref_to_lvalue, FromType,
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004778 ImplicitParamType);
4779 return ICS;
4780 }
4781 break;
4782 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004783
Douglas Gregor96176b32008-11-18 23:14:02 +00004784 // Success. Mark this as a reference binding.
John McCall1d318332010-01-12 00:44:57 +00004785 ICS.setStandard();
John McCallb1bdc622010-02-25 01:37:24 +00004786 ICS.Standard.setAsIdentityConversion();
4787 ICS.Standard.Second = SecondKind;
John McCall1d318332010-01-12 00:44:57 +00004788 ICS.Standard.setFromType(FromType);
Douglas Gregorad323a82010-01-27 03:51:04 +00004789 ICS.Standard.setAllToTypes(ImplicitParamType);
Douglas Gregor96176b32008-11-18 23:14:02 +00004790 ICS.Standard.ReferenceBinding = true;
4791 ICS.Standard.DirectBinding = true;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004792 ICS.Standard.IsLvalueReference = Method->getRefQualifier() != RQ_RValue;
Douglas Gregor440a4832011-01-26 14:52:12 +00004793 ICS.Standard.BindsToFunctionLvalue = false;
Douglas Gregorfcab48b2011-01-26 19:41:18 +00004794 ICS.Standard.BindsToRvalue = FromClassification.isRValue();
4795 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier
4796 = (Method->getRefQualifier() == RQ_None);
Douglas Gregor96176b32008-11-18 23:14:02 +00004797 return ICS;
4798}
4799
4800/// PerformObjectArgumentInitialization - Perform initialization of
4801/// the implicit object parameter for the given Method with the given
4802/// expression.
John Wiegley429bb272011-04-08 18:41:53 +00004803ExprResult
4804Sema::PerformObjectArgumentInitialization(Expr *From,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004805 NestedNameSpecifier *Qualifier,
John McCall6bb80172010-03-30 21:47:33 +00004806 NamedDecl *FoundDecl,
Douglas Gregor5fccd362010-03-03 23:55:11 +00004807 CXXMethodDecl *Method) {
Anders Carlssona552f7c2009-05-01 18:34:30 +00004808 QualType FromRecordType, DestType;
Mike Stump1eb44332009-09-09 15:08:12 +00004809 QualType ImplicitParamRecordType =
Ted Kremenek6217b802009-07-29 21:53:49 +00004810 Method->getThisType(Context)->getAs<PointerType>()->getPointeeType();
Mike Stump1eb44332009-09-09 15:08:12 +00004811
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004812 Expr::Classification FromClassification;
Ted Kremenek6217b802009-07-29 21:53:49 +00004813 if (const PointerType *PT = From->getType()->getAs<PointerType>()) {
Anders Carlssona552f7c2009-05-01 18:34:30 +00004814 FromRecordType = PT->getPointeeType();
4815 DestType = Method->getThisType(Context);
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004816 FromClassification = Expr::Classification::makeSimpleLValue();
Anders Carlssona552f7c2009-05-01 18:34:30 +00004817 } else {
4818 FromRecordType = From->getType();
4819 DestType = ImplicitParamRecordType;
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004820 FromClassification = From->Classify(Context);
Anders Carlssona552f7c2009-05-01 18:34:30 +00004821 }
4822
John McCall701c89e2009-12-03 04:06:58 +00004823 // Note that we always use the true parent context when performing
4824 // the actual argument initialization.
Mike Stump1eb44332009-09-09 15:08:12 +00004825 ImplicitConversionSequence ICS
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00004826 = TryObjectArgumentInitialization(*this, From->getType(), FromClassification,
4827 Method, Method->getParent());
Argyrios Kyrtzidis64ccf242010-11-16 08:04:45 +00004828 if (ICS.isBad()) {
4829 if (ICS.Bad.Kind == BadConversionSequence::bad_qualifiers) {
4830 Qualifiers FromQs = FromRecordType.getQualifiers();
4831 Qualifiers ToQs = DestType.getQualifiers();
4832 unsigned CVR = FromQs.getCVRQualifiers() & ~ToQs.getCVRQualifiers();
4833 if (CVR) {
Daniel Dunbar96a00142012-03-09 18:35:03 +00004834 Diag(From->getLocStart(),
Argyrios Kyrtzidis64ccf242010-11-16 08:04:45 +00004835 diag::err_member_function_call_bad_cvr)
4836 << Method->getDeclName() << FromRecordType << (CVR - 1)
4837 << From->getSourceRange();
4838 Diag(Method->getLocation(), diag::note_previous_decl)
4839 << Method->getDeclName();
John Wiegley429bb272011-04-08 18:41:53 +00004840 return ExprError();
Argyrios Kyrtzidis64ccf242010-11-16 08:04:45 +00004841 }
4842 }
4843
Daniel Dunbar96a00142012-03-09 18:35:03 +00004844 return Diag(From->getLocStart(),
Chris Lattnerfa25bbb2008-11-19 05:08:23 +00004845 diag::err_implicit_object_parameter_init)
Anders Carlssona552f7c2009-05-01 18:34:30 +00004846 << ImplicitParamRecordType << FromRecordType << From->getSourceRange();
Argyrios Kyrtzidis64ccf242010-11-16 08:04:45 +00004847 }
Mike Stump1eb44332009-09-09 15:08:12 +00004848
John Wiegley429bb272011-04-08 18:41:53 +00004849 if (ICS.Standard.Second == ICK_Derived_To_Base) {
4850 ExprResult FromRes =
4851 PerformObjectMemberConversion(From, Qualifier, FoundDecl, Method);
4852 if (FromRes.isInvalid())
4853 return ExprError();
4854 From = FromRes.take();
4855 }
Douglas Gregor96176b32008-11-18 23:14:02 +00004856
Douglas Gregor5fccd362010-03-03 23:55:11 +00004857 if (!Context.hasSameType(From->getType(), DestType))
John Wiegley429bb272011-04-08 18:41:53 +00004858 From = ImpCastExprToType(From, DestType, CK_NoOp,
Richard Smithacdfa4d2011-11-10 23:32:36 +00004859 From->getValueKind()).take();
John Wiegley429bb272011-04-08 18:41:53 +00004860 return Owned(From);
Douglas Gregor96176b32008-11-18 23:14:02 +00004861}
4862
Douglas Gregor09f41cf2009-01-14 15:45:31 +00004863/// TryContextuallyConvertToBool - Attempt to contextually convert the
4864/// expression From to bool (C++0x [conv]p3).
John McCall120d63c2010-08-24 20:38:10 +00004865static ImplicitConversionSequence
4866TryContextuallyConvertToBool(Sema &S, Expr *From) {
Douglas Gregorc6dfe192010-05-08 22:41:50 +00004867 // FIXME: This is pretty broken.
John McCall120d63c2010-08-24 20:38:10 +00004868 return TryImplicitConversion(S, From, S.Context.BoolTy,
Anders Carlssonda7a18b2009-08-27 17:24:15 +00004869 // FIXME: Are these flags correct?
4870 /*SuppressUserConversions=*/false,
Mike Stump1eb44332009-09-09 15:08:12 +00004871 /*AllowExplicit=*/true,
Douglas Gregor14d0aee2011-01-27 00:58:17 +00004872 /*InOverloadResolution=*/false,
John McCallf85e1932011-06-15 23:02:42 +00004873 /*CStyle=*/false,
4874 /*AllowObjCWritebackConversion=*/false);
Douglas Gregor09f41cf2009-01-14 15:45:31 +00004875}
4876
4877/// PerformContextuallyConvertToBool - Perform a contextual conversion
4878/// of the expression From to bool (C++0x [conv]p3).
John Wiegley429bb272011-04-08 18:41:53 +00004879ExprResult Sema::PerformContextuallyConvertToBool(Expr *From) {
John McCall3c3b7f92011-10-25 17:37:35 +00004880 if (checkPlaceholderForOverload(*this, From))
4881 return ExprError();
4882
John McCall120d63c2010-08-24 20:38:10 +00004883 ImplicitConversionSequence ICS = TryContextuallyConvertToBool(*this, From);
John McCall1d318332010-01-12 00:44:57 +00004884 if (!ICS.isBad())
4885 return PerformImplicitConversion(From, Context.BoolTy, ICS, AA_Converting);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004886
Fariborz Jahaniancc5306a2009-11-18 18:26:29 +00004887 if (!DiagnoseMultipleUserDefinedConversion(From, Context.BoolTy))
Daniel Dunbar96a00142012-03-09 18:35:03 +00004888 return Diag(From->getLocStart(),
John McCall864c0412011-04-26 20:42:42 +00004889 diag::err_typecheck_bool_condition)
Fariborz Jahanian17c7a5d2009-09-22 20:24:30 +00004890 << From->getType() << From->getSourceRange();
John Wiegley429bb272011-04-08 18:41:53 +00004891 return ExprError();
Douglas Gregor09f41cf2009-01-14 15:45:31 +00004892}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00004893
Richard Smith8ef7b202012-01-18 23:55:52 +00004894/// Check that the specified conversion is permitted in a converted constant
4895/// expression, according to C++11 [expr.const]p3. Return true if the conversion
4896/// is acceptable.
4897static bool CheckConvertedConstantConversions(Sema &S,
4898 StandardConversionSequence &SCS) {
4899 // Since we know that the target type is an integral or unscoped enumeration
4900 // type, most conversion kinds are impossible. All possible First and Third
4901 // conversions are fine.
4902 switch (SCS.Second) {
4903 case ICK_Identity:
4904 case ICK_Integral_Promotion:
4905 case ICK_Integral_Conversion:
Guy Benyei6959acd2013-02-07 16:05:33 +00004906 case ICK_Zero_Event_Conversion:
Richard Smith8ef7b202012-01-18 23:55:52 +00004907 return true;
4908
4909 case ICK_Boolean_Conversion:
Richard Smith2bcb9842012-09-13 22:00:12 +00004910 // Conversion from an integral or unscoped enumeration type to bool is
4911 // classified as ICK_Boolean_Conversion, but it's also an integral
4912 // conversion, so it's permitted in a converted constant expression.
4913 return SCS.getFromType()->isIntegralOrUnscopedEnumerationType() &&
4914 SCS.getToType(2)->isBooleanType();
4915
Richard Smith8ef7b202012-01-18 23:55:52 +00004916 case ICK_Floating_Integral:
4917 case ICK_Complex_Real:
4918 return false;
4919
4920 case ICK_Lvalue_To_Rvalue:
4921 case ICK_Array_To_Pointer:
4922 case ICK_Function_To_Pointer:
4923 case ICK_NoReturn_Adjustment:
4924 case ICK_Qualification:
4925 case ICK_Compatible_Conversion:
4926 case ICK_Vector_Conversion:
4927 case ICK_Vector_Splat:
4928 case ICK_Derived_To_Base:
4929 case ICK_Pointer_Conversion:
4930 case ICK_Pointer_Member:
4931 case ICK_Block_Pointer_Conversion:
4932 case ICK_Writeback_Conversion:
4933 case ICK_Floating_Promotion:
4934 case ICK_Complex_Promotion:
4935 case ICK_Complex_Conversion:
4936 case ICK_Floating_Conversion:
4937 case ICK_TransparentUnionConversion:
4938 llvm_unreachable("unexpected second conversion kind");
4939
4940 case ICK_Num_Conversion_Kinds:
4941 break;
4942 }
4943
4944 llvm_unreachable("unknown conversion kind");
4945}
4946
4947/// CheckConvertedConstantExpression - Check that the expression From is a
4948/// converted constant expression of type T, perform the conversion and produce
4949/// the converted expression, per C++11 [expr.const]p3.
4950ExprResult Sema::CheckConvertedConstantExpression(Expr *From, QualType T,
4951 llvm::APSInt &Value,
4952 CCEKind CCE) {
Richard Smith80ad52f2013-01-02 11:42:31 +00004953 assert(LangOpts.CPlusPlus11 && "converted constant expression outside C++11");
Richard Smith8ef7b202012-01-18 23:55:52 +00004954 assert(T->isIntegralOrEnumerationType() && "unexpected converted const type");
4955
4956 if (checkPlaceholderForOverload(*this, From))
4957 return ExprError();
4958
4959 // C++11 [expr.const]p3 with proposed wording fixes:
4960 // A converted constant expression of type T is a core constant expression,
4961 // implicitly converted to a prvalue of type T, where the converted
4962 // expression is a literal constant expression and the implicit conversion
4963 // sequence contains only user-defined conversions, lvalue-to-rvalue
4964 // conversions, integral promotions, and integral conversions other than
4965 // narrowing conversions.
4966 ImplicitConversionSequence ICS =
4967 TryImplicitConversion(From, T,
4968 /*SuppressUserConversions=*/false,
4969 /*AllowExplicit=*/false,
4970 /*InOverloadResolution=*/false,
4971 /*CStyle=*/false,
4972 /*AllowObjcWritebackConversion=*/false);
4973 StandardConversionSequence *SCS = 0;
4974 switch (ICS.getKind()) {
4975 case ImplicitConversionSequence::StandardConversion:
4976 if (!CheckConvertedConstantConversions(*this, ICS.Standard))
Daniel Dunbar96a00142012-03-09 18:35:03 +00004977 return Diag(From->getLocStart(),
Richard Smith8ef7b202012-01-18 23:55:52 +00004978 diag::err_typecheck_converted_constant_expression_disallowed)
4979 << From->getType() << From->getSourceRange() << T;
4980 SCS = &ICS.Standard;
4981 break;
4982 case ImplicitConversionSequence::UserDefinedConversion:
4983 // We are converting from class type to an integral or enumeration type, so
4984 // the Before sequence must be trivial.
4985 if (!CheckConvertedConstantConversions(*this, ICS.UserDefined.After))
Daniel Dunbar96a00142012-03-09 18:35:03 +00004986 return Diag(From->getLocStart(),
Richard Smith8ef7b202012-01-18 23:55:52 +00004987 diag::err_typecheck_converted_constant_expression_disallowed)
4988 << From->getType() << From->getSourceRange() << T;
4989 SCS = &ICS.UserDefined.After;
4990 break;
4991 case ImplicitConversionSequence::AmbiguousConversion:
4992 case ImplicitConversionSequence::BadConversion:
4993 if (!DiagnoseMultipleUserDefinedConversion(From, T))
Daniel Dunbar96a00142012-03-09 18:35:03 +00004994 return Diag(From->getLocStart(),
Richard Smith8ef7b202012-01-18 23:55:52 +00004995 diag::err_typecheck_converted_constant_expression)
4996 << From->getType() << From->getSourceRange() << T;
4997 return ExprError();
4998
4999 case ImplicitConversionSequence::EllipsisConversion:
5000 llvm_unreachable("ellipsis conversion in converted constant expression");
5001 }
5002
5003 ExprResult Result = PerformImplicitConversion(From, T, ICS, AA_Converting);
5004 if (Result.isInvalid())
5005 return Result;
5006
5007 // Check for a narrowing implicit conversion.
5008 APValue PreNarrowingValue;
Richard Smithf6028062012-03-23 23:55:39 +00005009 QualType PreNarrowingType;
Richard Smithf6028062012-03-23 23:55:39 +00005010 switch (SCS->getNarrowingKind(Context, Result.get(), PreNarrowingValue,
5011 PreNarrowingType)) {
Richard Smith8ef7b202012-01-18 23:55:52 +00005012 case NK_Variable_Narrowing:
5013 // Implicit conversion to a narrower type, and the value is not a constant
5014 // expression. We'll diagnose this in a moment.
5015 case NK_Not_Narrowing:
5016 break;
5017
5018 case NK_Constant_Narrowing:
Eli Friedman1ef28db2012-03-29 23:39:39 +00005019 Diag(From->getLocStart(),
5020 isSFINAEContext() ? diag::err_cce_narrowing_sfinae :
5021 diag::err_cce_narrowing)
Richard Smith8ef7b202012-01-18 23:55:52 +00005022 << CCE << /*Constant*/1
Richard Smithf6028062012-03-23 23:55:39 +00005023 << PreNarrowingValue.getAsString(Context, PreNarrowingType) << T;
Richard Smith8ef7b202012-01-18 23:55:52 +00005024 break;
5025
5026 case NK_Type_Narrowing:
Eli Friedman1ef28db2012-03-29 23:39:39 +00005027 Diag(From->getLocStart(),
5028 isSFINAEContext() ? diag::err_cce_narrowing_sfinae :
5029 diag::err_cce_narrowing)
Richard Smith8ef7b202012-01-18 23:55:52 +00005030 << CCE << /*Constant*/0 << From->getType() << T;
5031 break;
5032 }
5033
5034 // Check the expression is a constant expression.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005035 SmallVector<PartialDiagnosticAt, 8> Notes;
Richard Smith8ef7b202012-01-18 23:55:52 +00005036 Expr::EvalResult Eval;
5037 Eval.Diag = &Notes;
5038
Douglas Gregor484f6fa2013-04-08 23:24:07 +00005039 if (!Result.get()->EvaluateAsRValue(Eval, Context) || !Eval.Val.isInt()) {
Richard Smith8ef7b202012-01-18 23:55:52 +00005040 // The expression can't be folded, so we can't keep it at this position in
5041 // the AST.
5042 Result = ExprError();
Richard Smithf72fccf2012-01-30 22:27:01 +00005043 } else {
Richard Smith8ef7b202012-01-18 23:55:52 +00005044 Value = Eval.Val.getInt();
Richard Smithf72fccf2012-01-30 22:27:01 +00005045
5046 if (Notes.empty()) {
5047 // It's a constant expression.
5048 return Result;
5049 }
Richard Smith8ef7b202012-01-18 23:55:52 +00005050 }
5051
5052 // It's not a constant expression. Produce an appropriate diagnostic.
5053 if (Notes.size() == 1 &&
5054 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr)
5055 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
5056 else {
Daniel Dunbar96a00142012-03-09 18:35:03 +00005057 Diag(From->getLocStart(), diag::err_expr_not_cce)
Richard Smith8ef7b202012-01-18 23:55:52 +00005058 << CCE << From->getSourceRange();
5059 for (unsigned I = 0; I < Notes.size(); ++I)
5060 Diag(Notes[I].first, Notes[I].second);
5061 }
Richard Smithf72fccf2012-01-30 22:27:01 +00005062 return Result;
Richard Smith8ef7b202012-01-18 23:55:52 +00005063}
5064
John McCall0bcc9bc2011-09-09 06:11:02 +00005065/// dropPointerConversions - If the given standard conversion sequence
5066/// involves any pointer conversions, remove them. This may change
5067/// the result type of the conversion sequence.
5068static void dropPointerConversion(StandardConversionSequence &SCS) {
5069 if (SCS.Second == ICK_Pointer_Conversion) {
5070 SCS.Second = ICK_Identity;
5071 SCS.Third = ICK_Identity;
5072 SCS.ToTypePtrs[2] = SCS.ToTypePtrs[1] = SCS.ToTypePtrs[0];
5073 }
Fariborz Jahanian79d3f042010-05-12 23:29:11 +00005074}
John McCall120d63c2010-08-24 20:38:10 +00005075
John McCall0bcc9bc2011-09-09 06:11:02 +00005076/// TryContextuallyConvertToObjCPointer - Attempt to contextually
5077/// convert the expression From to an Objective-C pointer type.
5078static ImplicitConversionSequence
5079TryContextuallyConvertToObjCPointer(Sema &S, Expr *From) {
5080 // Do an implicit conversion to 'id'.
5081 QualType Ty = S.Context.getObjCIdType();
5082 ImplicitConversionSequence ICS
5083 = TryImplicitConversion(S, From, Ty,
5084 // FIXME: Are these flags correct?
5085 /*SuppressUserConversions=*/false,
5086 /*AllowExplicit=*/true,
5087 /*InOverloadResolution=*/false,
5088 /*CStyle=*/false,
5089 /*AllowObjCWritebackConversion=*/false);
5090
5091 // Strip off any final conversions to 'id'.
5092 switch (ICS.getKind()) {
5093 case ImplicitConversionSequence::BadConversion:
5094 case ImplicitConversionSequence::AmbiguousConversion:
5095 case ImplicitConversionSequence::EllipsisConversion:
5096 break;
5097
5098 case ImplicitConversionSequence::UserDefinedConversion:
5099 dropPointerConversion(ICS.UserDefined.After);
5100 break;
5101
5102 case ImplicitConversionSequence::StandardConversion:
5103 dropPointerConversion(ICS.Standard);
5104 break;
5105 }
5106
5107 return ICS;
5108}
5109
5110/// PerformContextuallyConvertToObjCPointer - Perform a contextual
5111/// conversion of the expression From to an Objective-C pointer type.
5112ExprResult Sema::PerformContextuallyConvertToObjCPointer(Expr *From) {
John McCall3c3b7f92011-10-25 17:37:35 +00005113 if (checkPlaceholderForOverload(*this, From))
5114 return ExprError();
5115
John McCallc12c5bb2010-05-15 11:32:37 +00005116 QualType Ty = Context.getObjCIdType();
John McCall0bcc9bc2011-09-09 06:11:02 +00005117 ImplicitConversionSequence ICS =
5118 TryContextuallyConvertToObjCPointer(*this, From);
Fariborz Jahanian79d3f042010-05-12 23:29:11 +00005119 if (!ICS.isBad())
5120 return PerformImplicitConversion(From, Ty, ICS, AA_Converting);
John Wiegley429bb272011-04-08 18:41:53 +00005121 return ExprError();
Fariborz Jahanian79d3f042010-05-12 23:29:11 +00005122}
Douglas Gregor09f41cf2009-01-14 15:45:31 +00005123
Richard Smithf39aec12012-02-04 07:07:42 +00005124/// Determine whether the provided type is an integral type, or an enumeration
5125/// type of a permitted flavor.
Richard Smith097e0a22013-05-21 19:05:48 +00005126bool Sema::ICEConvertDiagnoser::match(QualType T) {
5127 return AllowScopedEnumerations ? T->isIntegralOrEnumerationType()
5128 : T->isIntegralOrUnscopedEnumerationType();
Richard Smithf39aec12012-02-04 07:07:42 +00005129}
5130
Larisse Voufo50b60b32013-06-10 06:50:24 +00005131static ExprResult
5132diagnoseAmbiguousConversion(Sema &SemaRef, SourceLocation Loc, Expr *From,
5133 Sema::ContextualImplicitConverter &Converter,
5134 QualType T, UnresolvedSetImpl &ViableConversions) {
5135
5136 if (Converter.Suppress)
5137 return ExprError();
5138
5139 Converter.diagnoseAmbiguous(SemaRef, Loc, T) << From->getSourceRange();
5140 for (unsigned I = 0, N = ViableConversions.size(); I != N; ++I) {
5141 CXXConversionDecl *Conv =
5142 cast<CXXConversionDecl>(ViableConversions[I]->getUnderlyingDecl());
5143 QualType ConvTy = Conv->getConversionType().getNonReferenceType();
5144 Converter.noteAmbiguous(SemaRef, Conv, ConvTy);
5145 }
5146 return SemaRef.Owned(From);
5147}
5148
5149static bool
5150diagnoseNoViableConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From,
5151 Sema::ContextualImplicitConverter &Converter,
5152 QualType T, bool HadMultipleCandidates,
5153 UnresolvedSetImpl &ExplicitConversions) {
5154 if (ExplicitConversions.size() == 1 && !Converter.Suppress) {
5155 DeclAccessPair Found = ExplicitConversions[0];
5156 CXXConversionDecl *Conversion =
5157 cast<CXXConversionDecl>(Found->getUnderlyingDecl());
5158
5159 // The user probably meant to invoke the given explicit
5160 // conversion; use it.
5161 QualType ConvTy = Conversion->getConversionType().getNonReferenceType();
5162 std::string TypeStr;
5163 ConvTy.getAsStringInternal(TypeStr, SemaRef.getPrintingPolicy());
5164
5165 Converter.diagnoseExplicitConv(SemaRef, Loc, T, ConvTy)
5166 << FixItHint::CreateInsertion(From->getLocStart(),
5167 "static_cast<" + TypeStr + ">(")
5168 << FixItHint::CreateInsertion(
5169 SemaRef.PP.getLocForEndOfToken(From->getLocEnd()), ")");
5170 Converter.noteExplicitConv(SemaRef, Conversion, ConvTy);
5171
5172 // If we aren't in a SFINAE context, build a call to the
5173 // explicit conversion function.
5174 if (SemaRef.isSFINAEContext())
5175 return true;
5176
5177 SemaRef.CheckMemberOperatorAccess(From->getExprLoc(), From, 0, Found);
5178 ExprResult Result = SemaRef.BuildCXXMemberCallExpr(From, Found, Conversion,
5179 HadMultipleCandidates);
5180 if (Result.isInvalid())
5181 return true;
5182 // Record usage of conversion in an implicit cast.
5183 From = ImplicitCastExpr::Create(SemaRef.Context, Result.get()->getType(),
5184 CK_UserDefinedConversion, Result.get(), 0,
5185 Result.get()->getValueKind());
5186 }
5187 return false;
5188}
5189
5190static bool recordConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From,
5191 Sema::ContextualImplicitConverter &Converter,
5192 QualType T, bool HadMultipleCandidates,
5193 DeclAccessPair &Found) {
5194 CXXConversionDecl *Conversion =
5195 cast<CXXConversionDecl>(Found->getUnderlyingDecl());
5196 SemaRef.CheckMemberOperatorAccess(From->getExprLoc(), From, 0, Found);
5197
5198 QualType ToType = Conversion->getConversionType().getNonReferenceType();
5199 if (!Converter.SuppressConversion) {
5200 if (SemaRef.isSFINAEContext())
5201 return true;
5202
5203 Converter.diagnoseConversion(SemaRef, Loc, T, ToType)
5204 << From->getSourceRange();
5205 }
5206
5207 ExprResult Result = SemaRef.BuildCXXMemberCallExpr(From, Found, Conversion,
5208 HadMultipleCandidates);
5209 if (Result.isInvalid())
5210 return true;
5211 // Record usage of conversion in an implicit cast.
5212 From = ImplicitCastExpr::Create(SemaRef.Context, Result.get()->getType(),
5213 CK_UserDefinedConversion, Result.get(), 0,
5214 Result.get()->getValueKind());
5215 return false;
5216}
5217
5218static ExprResult finishContextualImplicitConversion(
5219 Sema &SemaRef, SourceLocation Loc, Expr *From,
5220 Sema::ContextualImplicitConverter &Converter) {
5221 if (!Converter.match(From->getType()) && !Converter.Suppress)
5222 Converter.diagnoseNoMatch(SemaRef, Loc, From->getType())
5223 << From->getSourceRange();
5224
5225 return SemaRef.DefaultLvalueConversion(From);
5226}
5227
5228static void
5229collectViableConversionCandidates(Sema &SemaRef, Expr *From, QualType ToType,
5230 UnresolvedSetImpl &ViableConversions,
5231 OverloadCandidateSet &CandidateSet) {
5232 for (unsigned I = 0, N = ViableConversions.size(); I != N; ++I) {
5233 DeclAccessPair FoundDecl = ViableConversions[I];
5234 NamedDecl *D = FoundDecl.getDecl();
5235 CXXRecordDecl *ActingContext = cast<CXXRecordDecl>(D->getDeclContext());
5236 if (isa<UsingShadowDecl>(D))
5237 D = cast<UsingShadowDecl>(D)->getTargetDecl();
5238
5239 CXXConversionDecl *Conv;
5240 FunctionTemplateDecl *ConvTemplate;
5241 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
5242 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
5243 else
5244 Conv = cast<CXXConversionDecl>(D);
5245
5246 if (ConvTemplate)
5247 SemaRef.AddTemplateConversionCandidate(
5248 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet);
5249 else
5250 SemaRef.AddConversionCandidate(Conv, FoundDecl, ActingContext, From,
5251 ToType, CandidateSet);
5252 }
5253}
5254
Richard Smith097e0a22013-05-21 19:05:48 +00005255/// \brief Attempt to convert the given expression to a type which is accepted
5256/// by the given converter.
Douglas Gregorc30614b2010-06-29 23:17:37 +00005257///
Richard Smith097e0a22013-05-21 19:05:48 +00005258/// This routine will attempt to convert an expression of class type to a
5259/// type accepted by the specified converter. In C++11 and before, the class
5260/// must have a single non-explicit conversion function converting to a matching
5261/// type. In C++1y, there can be multiple such conversion functions, but only
5262/// one target type.
Douglas Gregorc30614b2010-06-29 23:17:37 +00005263///
Douglas Gregor6bc574d2010-06-30 00:20:43 +00005264/// \param Loc The source location of the construct that requires the
5265/// conversion.
Douglas Gregorc30614b2010-06-29 23:17:37 +00005266///
James Dennett40ae6662012-06-22 08:52:37 +00005267/// \param From The expression we're converting from.
Douglas Gregor6bc574d2010-06-30 00:20:43 +00005268///
Richard Smith097e0a22013-05-21 19:05:48 +00005269/// \param Converter Used to control and diagnose the conversion process.
Richard Smithf39aec12012-02-04 07:07:42 +00005270///
Douglas Gregor6bc574d2010-06-30 00:20:43 +00005271/// \returns The expression, converted to an integral or enumeration type if
5272/// successful.
Richard Smith097e0a22013-05-21 19:05:48 +00005273ExprResult Sema::PerformContextualImplicitConversion(
5274 SourceLocation Loc, Expr *From, ContextualImplicitConverter &Converter) {
Douglas Gregorc30614b2010-06-29 23:17:37 +00005275 // We can't perform any more checking for type-dependent expressions.
5276 if (From->isTypeDependent())
John McCall9ae2f072010-08-23 23:25:46 +00005277 return Owned(From);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005278
Eli Friedmanceccab92012-01-26 00:26:18 +00005279 // Process placeholders immediately.
5280 if (From->hasPlaceholderType()) {
5281 ExprResult result = CheckPlaceholderExpr(From);
Larisse Voufo50b60b32013-06-10 06:50:24 +00005282 if (result.isInvalid())
5283 return result;
Eli Friedmanceccab92012-01-26 00:26:18 +00005284 From = result.take();
5285 }
5286
Richard Smith097e0a22013-05-21 19:05:48 +00005287 // If the expression already has a matching type, we're golden.
Douglas Gregorc30614b2010-06-29 23:17:37 +00005288 QualType T = From->getType();
Richard Smith097e0a22013-05-21 19:05:48 +00005289 if (Converter.match(T))
Eli Friedmanceccab92012-01-26 00:26:18 +00005290 return DefaultLvalueConversion(From);
Douglas Gregorc30614b2010-06-29 23:17:37 +00005291
5292 // FIXME: Check for missing '()' if T is a function type?
5293
Richard Smith097e0a22013-05-21 19:05:48 +00005294 // We can only perform contextual implicit conversions on objects of class
5295 // type.
Douglas Gregorc30614b2010-06-29 23:17:37 +00005296 const RecordType *RecordTy = T->getAs<RecordType>();
David Blaikie4e4d0842012-03-11 07:00:24 +00005297 if (!RecordTy || !getLangOpts().CPlusPlus) {
Richard Smith097e0a22013-05-21 19:05:48 +00005298 if (!Converter.Suppress)
5299 Converter.diagnoseNoMatch(*this, Loc, T) << From->getSourceRange();
John McCall9ae2f072010-08-23 23:25:46 +00005300 return Owned(From);
Douglas Gregorc30614b2010-06-29 23:17:37 +00005301 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005302
Douglas Gregorc30614b2010-06-29 23:17:37 +00005303 // We must have a complete class type.
Douglas Gregorf502d8e2012-05-04 16:48:41 +00005304 struct TypeDiagnoserPartialDiag : TypeDiagnoser {
Richard Smith097e0a22013-05-21 19:05:48 +00005305 ContextualImplicitConverter &Converter;
Douglas Gregorab41fe92012-05-04 22:38:52 +00005306 Expr *From;
Richard Smith097e0a22013-05-21 19:05:48 +00005307
5308 TypeDiagnoserPartialDiag(ContextualImplicitConverter &Converter, Expr *From)
5309 : TypeDiagnoser(Converter.Suppress), Converter(Converter), From(From) {}
5310
Douglas Gregord10099e2012-05-04 16:32:21 +00005311 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) {
Richard Smith097e0a22013-05-21 19:05:48 +00005312 Converter.diagnoseIncomplete(S, Loc, T) << From->getSourceRange();
Douglas Gregord10099e2012-05-04 16:32:21 +00005313 }
Richard Smith097e0a22013-05-21 19:05:48 +00005314 } IncompleteDiagnoser(Converter, From);
Douglas Gregord10099e2012-05-04 16:32:21 +00005315
5316 if (RequireCompleteType(Loc, T, IncompleteDiagnoser))
John McCall9ae2f072010-08-23 23:25:46 +00005317 return Owned(From);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005318
Douglas Gregorc30614b2010-06-29 23:17:37 +00005319 // Look for a conversion to an integral or enumeration type.
Larisse Voufo50b60b32013-06-10 06:50:24 +00005320 UnresolvedSet<4>
5321 ViableConversions; // These are *potentially* viable in C++1y.
Douglas Gregorc30614b2010-06-29 23:17:37 +00005322 UnresolvedSet<4> ExplicitConversions;
Argyrios Kyrtzidis9d295432012-11-28 03:56:09 +00005323 std::pair<CXXRecordDecl::conversion_iterator,
Larisse Voufo50b60b32013-06-10 06:50:24 +00005324 CXXRecordDecl::conversion_iterator> Conversions =
5325 cast<CXXRecordDecl>(RecordTy->getDecl())->getVisibleConversionFunctions();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005326
Larisse Voufo50b60b32013-06-10 06:50:24 +00005327 bool HadMultipleCandidates =
5328 (std::distance(Conversions.first, Conversions.second) > 1);
Abramo Bagnara7cc58b42011-10-05 07:56:41 +00005329
Larisse Voufo50b60b32013-06-10 06:50:24 +00005330 // To check that there is only one target type, in C++1y:
5331 QualType ToType;
5332 bool HasUniqueTargetType = true;
5333
5334 // Collect explicit or viable (potentially in C++1y) conversions.
5335 for (CXXRecordDecl::conversion_iterator I = Conversions.first,
5336 E = Conversions.second;
5337 I != E; ++I) {
5338 NamedDecl *D = (*I)->getUnderlyingDecl();
5339 CXXConversionDecl *Conversion;
5340 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
5341 if (ConvTemplate) {
5342 if (getLangOpts().CPlusPlus1y)
5343 Conversion = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
5344 else
5345 continue; // C++11 does not consider conversion operator templates(?).
5346 } else
5347 Conversion = cast<CXXConversionDecl>(D);
5348
5349 assert((!ConvTemplate || getLangOpts().CPlusPlus1y) &&
5350 "Conversion operator templates are considered potentially "
5351 "viable in C++1y");
5352
5353 QualType CurToType = Conversion->getConversionType().getNonReferenceType();
5354 if (Converter.match(CurToType) || ConvTemplate) {
5355
5356 if (Conversion->isExplicit()) {
5357 // FIXME: For C++1y, do we need this restriction?
5358 // cf. diagnoseNoViableConversion()
5359 if (!ConvTemplate)
Douglas Gregorc30614b2010-06-29 23:17:37 +00005360 ExplicitConversions.addDecl(I.getDecl(), I.getAccess());
Larisse Voufo50b60b32013-06-10 06:50:24 +00005361 } else {
5362 if (!ConvTemplate && getLangOpts().CPlusPlus1y) {
5363 if (ToType.isNull())
5364 ToType = CurToType.getUnqualifiedType();
5365 else if (HasUniqueTargetType &&
5366 (CurToType.getUnqualifiedType() != ToType))
5367 HasUniqueTargetType = false;
5368 }
5369 ViableConversions.addDecl(I.getDecl(), I.getAccess());
Douglas Gregorc30614b2010-06-29 23:17:37 +00005370 }
Richard Smithf39aec12012-02-04 07:07:42 +00005371 }
Douglas Gregorc30614b2010-06-29 23:17:37 +00005372 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005373
Larisse Voufo50b60b32013-06-10 06:50:24 +00005374 if (getLangOpts().CPlusPlus1y) {
5375 // C++1y [conv]p6:
5376 // ... An expression e of class type E appearing in such a context
5377 // is said to be contextually implicitly converted to a specified
5378 // type T and is well-formed if and only if e can be implicitly
5379 // converted to a type T that is determined as follows: E is searched
Larisse Voufo7acc5a62013-06-10 08:25:58 +00005380 // for conversion functions whose return type is cv T or reference to
5381 // cv T such that T is allowed by the context. There shall be
Larisse Voufo50b60b32013-06-10 06:50:24 +00005382 // exactly one such T.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005383
Larisse Voufo50b60b32013-06-10 06:50:24 +00005384 // If no unique T is found:
5385 if (ToType.isNull()) {
5386 if (diagnoseNoViableConversion(*this, Loc, From, Converter, T,
5387 HadMultipleCandidates,
5388 ExplicitConversions))
Douglas Gregorc30614b2010-06-29 23:17:37 +00005389 return ExprError();
Larisse Voufo50b60b32013-06-10 06:50:24 +00005390 return finishContextualImplicitConversion(*this, Loc, From, Converter);
Douglas Gregorc30614b2010-06-29 23:17:37 +00005391 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005392
Larisse Voufo50b60b32013-06-10 06:50:24 +00005393 // If more than one unique Ts are found:
5394 if (!HasUniqueTargetType)
5395 return diagnoseAmbiguousConversion(*this, Loc, From, Converter, T,
5396 ViableConversions);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005397
Larisse Voufo50b60b32013-06-10 06:50:24 +00005398 // If one unique T is found:
5399 // First, build a candidate set from the previously recorded
5400 // potentially viable conversions.
5401 OverloadCandidateSet CandidateSet(Loc);
5402 collectViableConversionCandidates(*this, From, ToType, ViableConversions,
5403 CandidateSet);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005404
Larisse Voufo50b60b32013-06-10 06:50:24 +00005405 // Then, perform overload resolution over the candidate set.
5406 OverloadCandidateSet::iterator Best;
5407 switch (CandidateSet.BestViableFunction(*this, Loc, Best)) {
5408 case OR_Success: {
5409 // Apply this conversion.
5410 DeclAccessPair Found =
5411 DeclAccessPair::make(Best->Function, Best->FoundDecl.getAccess());
5412 if (recordConversion(*this, Loc, From, Converter, T,
5413 HadMultipleCandidates, Found))
5414 return ExprError();
5415 break;
5416 }
5417 case OR_Ambiguous:
5418 return diagnoseAmbiguousConversion(*this, Loc, From, Converter, T,
5419 ViableConversions);
5420 case OR_No_Viable_Function:
5421 if (diagnoseNoViableConversion(*this, Loc, From, Converter, T,
5422 HadMultipleCandidates,
5423 ExplicitConversions))
5424 return ExprError();
5425 // fall through 'OR_Deleted' case.
5426 case OR_Deleted:
5427 // We'll complain below about a non-integral condition type.
5428 break;
5429 }
5430 } else {
5431 switch (ViableConversions.size()) {
5432 case 0: {
5433 if (diagnoseNoViableConversion(*this, Loc, From, Converter, T,
5434 HadMultipleCandidates,
5435 ExplicitConversions))
Douglas Gregor6bc574d2010-06-30 00:20:43 +00005436 return ExprError();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005437
Larisse Voufo50b60b32013-06-10 06:50:24 +00005438 // We'll complain below about a non-integral condition type.
5439 break;
Douglas Gregor6bc574d2010-06-30 00:20:43 +00005440 }
Larisse Voufo50b60b32013-06-10 06:50:24 +00005441 case 1: {
5442 // Apply this conversion.
5443 DeclAccessPair Found = ViableConversions[0];
5444 if (recordConversion(*this, Loc, From, Converter, T,
5445 HadMultipleCandidates, Found))
5446 return ExprError();
5447 break;
5448 }
5449 default:
5450 return diagnoseAmbiguousConversion(*this, Loc, From, Converter, T,
5451 ViableConversions);
5452 }
Douglas Gregorc30614b2010-06-29 23:17:37 +00005453 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005454
Larisse Voufo50b60b32013-06-10 06:50:24 +00005455 return finishContextualImplicitConversion(*this, Loc, From, Converter);
Douglas Gregorc30614b2010-06-29 23:17:37 +00005456}
5457
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005458/// AddOverloadCandidate - Adds the given function to the set of
Douglas Gregor225c41e2008-11-03 19:09:14 +00005459/// candidate functions, using the given function call arguments. If
5460/// @p SuppressUserConversions, then don't allow user-defined
5461/// conversions via constructors or conversion operators.
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00005462///
James Dennett699c9042012-06-15 07:13:21 +00005463/// \param PartialOverloading true if we are performing "partial" overloading
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00005464/// based on an incomplete set of function arguments. This feature is used by
5465/// code completion.
Mike Stump1eb44332009-09-09 15:08:12 +00005466void
5467Sema::AddOverloadCandidate(FunctionDecl *Function,
John McCall9aa472c2010-03-19 07:35:19 +00005468 DeclAccessPair FoundDecl,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005469 ArrayRef<Expr *> Args,
Douglas Gregor225c41e2008-11-03 19:09:14 +00005470 OverloadCandidateSet& CandidateSet,
Sebastian Redle2b68332009-04-12 17:16:29 +00005471 bool SuppressUserConversions,
Douglas Gregored878af2012-02-24 23:56:31 +00005472 bool PartialOverloading,
5473 bool AllowExplicit) {
Mike Stump1eb44332009-09-09 15:08:12 +00005474 const FunctionProtoType* Proto
John McCall183700f2009-09-21 23:43:11 +00005475 = dyn_cast<FunctionProtoType>(Function->getType()->getAs<FunctionType>());
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005476 assert(Proto && "Functions without a prototype cannot be overloaded");
Mike Stump1eb44332009-09-09 15:08:12 +00005477 assert(!Function->getDescribedFunctionTemplate() &&
NAKAMURA Takumi00995302011-01-27 07:09:49 +00005478 "Use AddTemplateOverloadCandidate for function templates");
Mike Stump1eb44332009-09-09 15:08:12 +00005479
Douglas Gregor88a35142008-12-22 05:46:06 +00005480 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Function)) {
Sebastian Redl3201f6b2009-04-16 17:51:27 +00005481 if (!isa<CXXConstructorDecl>(Method)) {
5482 // If we get here, it's because we're calling a member function
5483 // that is named without a member access expression (e.g.,
5484 // "this->f") that was either written explicitly or created
5485 // implicitly. This can happen with a qualified call to a member
John McCall701c89e2009-12-03 04:06:58 +00005486 // function, e.g., X::f(). We use an empty type for the implied
5487 // object argument (C++ [over.call.func]p3), and the acting context
5488 // is irrelevant.
John McCall9aa472c2010-03-19 07:35:19 +00005489 AddMethodCandidate(Method, FoundDecl, Method->getParent(),
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005490 QualType(), Expr::Classification::makeSimpleLValue(),
Ahmed Charles13a140c2012-02-25 11:00:22 +00005491 Args, CandidateSet, SuppressUserConversions);
Sebastian Redl3201f6b2009-04-16 17:51:27 +00005492 return;
5493 }
5494 // We treat a constructor like a non-member function, since its object
5495 // argument doesn't participate in overload resolution.
Douglas Gregor88a35142008-12-22 05:46:06 +00005496 }
5497
Douglas Gregorfd476482009-11-13 23:59:09 +00005498 if (!CandidateSet.isNewCandidate(Function))
Douglas Gregor3f396022009-09-28 04:47:19 +00005499 return;
Douglas Gregor66724ea2009-11-14 01:20:54 +00005500
Douglas Gregor7edfb692009-11-23 12:27:39 +00005501 // Overload resolution is always an unevaluated context.
John McCallf312b1e2010-08-26 23:41:50 +00005502 EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated);
Douglas Gregor7edfb692009-11-23 12:27:39 +00005503
Douglas Gregor66724ea2009-11-14 01:20:54 +00005504 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Function)){
5505 // C++ [class.copy]p3:
5506 // A member function template is never instantiated to perform the copy
5507 // of a class object to an object of its class type.
5508 QualType ClassType = Context.getTypeDeclType(Constructor->getParent());
Ahmed Charles13a140c2012-02-25 11:00:22 +00005509 if (Args.size() == 1 &&
Douglas Gregor6493cc52010-11-08 17:16:59 +00005510 Constructor->isSpecializationCopyingObject() &&
Douglas Gregor12116062010-02-21 18:30:38 +00005511 (Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
5512 IsDerivedFrom(Args[0]->getType(), ClassType)))
Douglas Gregor66724ea2009-11-14 01:20:54 +00005513 return;
5514 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005515
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005516 // Add this candidate
Ahmed Charles13a140c2012-02-25 11:00:22 +00005517 OverloadCandidate &Candidate = CandidateSet.addCandidate(Args.size());
John McCall9aa472c2010-03-19 07:35:19 +00005518 Candidate.FoundDecl = FoundDecl;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005519 Candidate.Function = Function;
Douglas Gregor88a35142008-12-22 05:46:06 +00005520 Candidate.Viable = true;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00005521 Candidate.IsSurrogate = false;
Douglas Gregor88a35142008-12-22 05:46:06 +00005522 Candidate.IgnoreObjectArgument = false;
Ahmed Charles13a140c2012-02-25 11:00:22 +00005523 Candidate.ExplicitCallArguments = Args.size();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005524
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005525 unsigned NumArgsInProto = Proto->getNumArgs();
5526
5527 // (C++ 13.3.2p2): A candidate function having fewer than m
5528 // parameters is viable only if it has an ellipsis in its parameter
5529 // list (8.3.5).
Ahmed Charles13a140c2012-02-25 11:00:22 +00005530 if ((Args.size() + (PartialOverloading && Args.size())) > NumArgsInProto &&
Douglas Gregor5bd1a112009-09-23 14:56:09 +00005531 !Proto->isVariadic()) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005532 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005533 Candidate.FailureKind = ovl_fail_too_many_arguments;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005534 return;
5535 }
5536
5537 // (C++ 13.3.2p2): A candidate function having more than m parameters
5538 // is viable only if the (m+1)st parameter has a default argument
5539 // (8.3.6). For the purposes of overload resolution, the
5540 // parameter list is truncated on the right, so that there are
5541 // exactly m parameters.
5542 unsigned MinRequiredArgs = Function->getMinRequiredArguments();
Ahmed Charles13a140c2012-02-25 11:00:22 +00005543 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005544 // Not enough arguments.
5545 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005546 Candidate.FailureKind = ovl_fail_too_few_arguments;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005547 return;
5548 }
5549
Peter Collingbourne78dd67e2011-10-02 23:49:40 +00005550 // (CUDA B.1): Check for invalid calls between targets.
David Blaikie4e4d0842012-03-11 07:00:24 +00005551 if (getLangOpts().CUDA)
Peter Collingbourne78dd67e2011-10-02 23:49:40 +00005552 if (const FunctionDecl *Caller = dyn_cast<FunctionDecl>(CurContext))
5553 if (CheckCUDATarget(Caller, Function)) {
5554 Candidate.Viable = false;
5555 Candidate.FailureKind = ovl_fail_bad_target;
5556 return;
5557 }
5558
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005559 // Determine the implicit conversion sequences for each of the
5560 // arguments.
Ahmed Charles13a140c2012-02-25 11:00:22 +00005561 for (unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005562 if (ArgIdx < NumArgsInProto) {
5563 // (C++ 13.3.2p3): for F to be a viable function, there shall
5564 // exist for each argument an implicit conversion sequence
5565 // (13.3.3.1) that converts that argument to the corresponding
5566 // parameter of F.
5567 QualType ParamType = Proto->getArgType(ArgIdx);
Mike Stump1eb44332009-09-09 15:08:12 +00005568 Candidate.Conversions[ArgIdx]
Douglas Gregor74eb6582010-04-16 17:51:22 +00005569 = TryCopyInitialization(*this, Args[ArgIdx], ParamType,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005570 SuppressUserConversions,
John McCallf85e1932011-06-15 23:02:42 +00005571 /*InOverloadResolution=*/true,
5572 /*AllowObjCWritebackConversion=*/
David Blaikie4e4d0842012-03-11 07:00:24 +00005573 getLangOpts().ObjCAutoRefCount,
Douglas Gregored878af2012-02-24 23:56:31 +00005574 AllowExplicit);
John McCall1d318332010-01-12 00:44:57 +00005575 if (Candidate.Conversions[ArgIdx].isBad()) {
5576 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005577 Candidate.FailureKind = ovl_fail_bad_conversion;
John McCall1d318332010-01-12 00:44:57 +00005578 break;
Douglas Gregor96176b32008-11-18 23:14:02 +00005579 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005580 } else {
5581 // (C++ 13.3.2p2): For the purposes of overload resolution, any
5582 // argument for which there is no corresponding parameter is
5583 // considered to ""match the ellipsis" (C+ 13.3.3.1.3).
John McCall1d318332010-01-12 00:44:57 +00005584 Candidate.Conversions[ArgIdx].setEllipsis();
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00005585 }
5586 }
5587}
5588
Douglas Gregor063daf62009-03-13 18:40:31 +00005589/// \brief Add all of the function declarations in the given function set to
5590/// the overload canddiate set.
John McCall6e266892010-01-26 03:27:55 +00005591void Sema::AddFunctionCandidates(const UnresolvedSetImpl &Fns,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005592 ArrayRef<Expr *> Args,
Douglas Gregor063daf62009-03-13 18:40:31 +00005593 OverloadCandidateSet& CandidateSet,
Richard Smith36f5cfe2012-03-09 08:00:36 +00005594 bool SuppressUserConversions,
5595 TemplateArgumentListInfo *ExplicitTemplateArgs) {
John McCall6e266892010-01-26 03:27:55 +00005596 for (UnresolvedSetIterator F = Fns.begin(), E = Fns.end(); F != E; ++F) {
John McCall9aa472c2010-03-19 07:35:19 +00005597 NamedDecl *D = F.getDecl()->getUnderlyingDecl();
5598 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
Douglas Gregor3f396022009-09-28 04:47:19 +00005599 if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic())
John McCall9aa472c2010-03-19 07:35:19 +00005600 AddMethodCandidate(cast<CXXMethodDecl>(FD), F.getPair(),
John McCall701c89e2009-12-03 04:06:58 +00005601 cast<CXXMethodDecl>(FD)->getParent(),
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00005602 Args[0]->getType(), Args[0]->Classify(Context),
Ahmed Charles13a140c2012-02-25 11:00:22 +00005603 Args.slice(1), CandidateSet,
5604 SuppressUserConversions);
Douglas Gregor3f396022009-09-28 04:47:19 +00005605 else
Ahmed Charles13a140c2012-02-25 11:00:22 +00005606 AddOverloadCandidate(FD, F.getPair(), Args, CandidateSet,
Douglas Gregor3f396022009-09-28 04:47:19 +00005607 SuppressUserConversions);
5608 } else {
John McCall9aa472c2010-03-19 07:35:19 +00005609 FunctionTemplateDecl *FunTmpl = cast<FunctionTemplateDecl>(D);
Douglas Gregor3f396022009-09-28 04:47:19 +00005610 if (isa<CXXMethodDecl>(FunTmpl->getTemplatedDecl()) &&
5611 !cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl())->isStatic())
John McCall9aa472c2010-03-19 07:35:19 +00005612 AddMethodTemplateCandidate(FunTmpl, F.getPair(),
John McCall701c89e2009-12-03 04:06:58 +00005613 cast<CXXRecordDecl>(FunTmpl->getDeclContext()),
Richard Smith36f5cfe2012-03-09 08:00:36 +00005614 ExplicitTemplateArgs,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005615 Args[0]->getType(),
Ahmed Charles13a140c2012-02-25 11:00:22 +00005616 Args[0]->Classify(Context), Args.slice(1),
5617 CandidateSet, SuppressUserConversions);
Douglas Gregor3f396022009-09-28 04:47:19 +00005618 else
John McCall9aa472c2010-03-19 07:35:19 +00005619 AddTemplateOverloadCandidate(FunTmpl, F.getPair(),
Richard Smith36f5cfe2012-03-09 08:00:36 +00005620 ExplicitTemplateArgs, Args,
Ahmed Charles13a140c2012-02-25 11:00:22 +00005621 CandidateSet, SuppressUserConversions);
Douglas Gregor3f396022009-09-28 04:47:19 +00005622 }
Douglas Gregor364e0212009-06-27 21:05:07 +00005623 }
Douglas Gregor063daf62009-03-13 18:40:31 +00005624}
5625
John McCall314be4e2009-11-17 07:50:12 +00005626/// AddMethodCandidate - Adds a named decl (which is some kind of
5627/// method) as a method candidate to the given overload set.
John McCall9aa472c2010-03-19 07:35:19 +00005628void Sema::AddMethodCandidate(DeclAccessPair FoundDecl,
John McCall701c89e2009-12-03 04:06:58 +00005629 QualType ObjectType,
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00005630 Expr::Classification ObjectClassification,
Rafael Espindola548107e2013-04-29 19:29:25 +00005631 ArrayRef<Expr *> Args,
John McCall314be4e2009-11-17 07:50:12 +00005632 OverloadCandidateSet& CandidateSet,
Douglas Gregor7ec77522010-04-16 17:33:27 +00005633 bool SuppressUserConversions) {
John McCall9aa472c2010-03-19 07:35:19 +00005634 NamedDecl *Decl = FoundDecl.getDecl();
John McCall701c89e2009-12-03 04:06:58 +00005635 CXXRecordDecl *ActingContext = cast<CXXRecordDecl>(Decl->getDeclContext());
John McCall314be4e2009-11-17 07:50:12 +00005636
5637 if (isa<UsingShadowDecl>(Decl))
5638 Decl = cast<UsingShadowDecl>(Decl)->getTargetDecl();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005639
John McCall314be4e2009-11-17 07:50:12 +00005640 if (FunctionTemplateDecl *TD = dyn_cast<FunctionTemplateDecl>(Decl)) {
5641 assert(isa<CXXMethodDecl>(TD->getTemplatedDecl()) &&
5642 "Expected a member function template");
John McCall9aa472c2010-03-19 07:35:19 +00005643 AddMethodTemplateCandidate(TD, FoundDecl, ActingContext,
5644 /*ExplicitArgs*/ 0,
Ahmed Charles13a140c2012-02-25 11:00:22 +00005645 ObjectType, ObjectClassification,
Rafael Espindola548107e2013-04-29 19:29:25 +00005646 Args, CandidateSet,
Douglas Gregor7ec77522010-04-16 17:33:27 +00005647 SuppressUserConversions);
John McCall314be4e2009-11-17 07:50:12 +00005648 } else {
John McCall9aa472c2010-03-19 07:35:19 +00005649 AddMethodCandidate(cast<CXXMethodDecl>(Decl), FoundDecl, ActingContext,
Ahmed Charles13a140c2012-02-25 11:00:22 +00005650 ObjectType, ObjectClassification,
Rafael Espindola548107e2013-04-29 19:29:25 +00005651 Args,
Douglas Gregor7ec77522010-04-16 17:33:27 +00005652 CandidateSet, SuppressUserConversions);
John McCall314be4e2009-11-17 07:50:12 +00005653 }
5654}
5655
Douglas Gregor96176b32008-11-18 23:14:02 +00005656/// AddMethodCandidate - Adds the given C++ member function to the set
5657/// of candidate functions, using the given function call arguments
5658/// and the object argument (@c Object). For example, in a call
5659/// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
5660/// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
5661/// allow user-defined conversions via constructors or conversion
Douglas Gregor7ec77522010-04-16 17:33:27 +00005662/// operators.
Mike Stump1eb44332009-09-09 15:08:12 +00005663void
John McCall9aa472c2010-03-19 07:35:19 +00005664Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
John McCall86820f52010-01-26 01:37:31 +00005665 CXXRecordDecl *ActingContext, QualType ObjectType,
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00005666 Expr::Classification ObjectClassification,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005667 ArrayRef<Expr *> Args,
Douglas Gregor96176b32008-11-18 23:14:02 +00005668 OverloadCandidateSet& CandidateSet,
Douglas Gregor7ec77522010-04-16 17:33:27 +00005669 bool SuppressUserConversions) {
Mike Stump1eb44332009-09-09 15:08:12 +00005670 const FunctionProtoType* Proto
John McCall183700f2009-09-21 23:43:11 +00005671 = dyn_cast<FunctionProtoType>(Method->getType()->getAs<FunctionType>());
Douglas Gregor96176b32008-11-18 23:14:02 +00005672 assert(Proto && "Methods without a prototype cannot be overloaded");
Sebastian Redl3201f6b2009-04-16 17:51:27 +00005673 assert(!isa<CXXConstructorDecl>(Method) &&
5674 "Use AddOverloadCandidate for constructors");
Douglas Gregor96176b32008-11-18 23:14:02 +00005675
Douglas Gregor3f396022009-09-28 04:47:19 +00005676 if (!CandidateSet.isNewCandidate(Method))
5677 return;
5678
Douglas Gregor7edfb692009-11-23 12:27:39 +00005679 // Overload resolution is always an unevaluated context.
John McCallf312b1e2010-08-26 23:41:50 +00005680 EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated);
Douglas Gregor7edfb692009-11-23 12:27:39 +00005681
Douglas Gregor96176b32008-11-18 23:14:02 +00005682 // Add this candidate
Ahmed Charles13a140c2012-02-25 11:00:22 +00005683 OverloadCandidate &Candidate = CandidateSet.addCandidate(Args.size() + 1);
John McCall9aa472c2010-03-19 07:35:19 +00005684 Candidate.FoundDecl = FoundDecl;
Douglas Gregor96176b32008-11-18 23:14:02 +00005685 Candidate.Function = Method;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00005686 Candidate.IsSurrogate = false;
Douglas Gregor88a35142008-12-22 05:46:06 +00005687 Candidate.IgnoreObjectArgument = false;
Ahmed Charles13a140c2012-02-25 11:00:22 +00005688 Candidate.ExplicitCallArguments = Args.size();
Douglas Gregor96176b32008-11-18 23:14:02 +00005689
5690 unsigned NumArgsInProto = Proto->getNumArgs();
5691
5692 // (C++ 13.3.2p2): A candidate function having fewer than m
5693 // parameters is viable only if it has an ellipsis in its parameter
5694 // list (8.3.5).
Ahmed Charles13a140c2012-02-25 11:00:22 +00005695 if (Args.size() > NumArgsInProto && !Proto->isVariadic()) {
Douglas Gregor96176b32008-11-18 23:14:02 +00005696 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005697 Candidate.FailureKind = ovl_fail_too_many_arguments;
Douglas Gregor96176b32008-11-18 23:14:02 +00005698 return;
5699 }
5700
5701 // (C++ 13.3.2p2): A candidate function having more than m parameters
5702 // is viable only if the (m+1)st parameter has a default argument
5703 // (8.3.6). For the purposes of overload resolution, the
5704 // parameter list is truncated on the right, so that there are
5705 // exactly m parameters.
5706 unsigned MinRequiredArgs = Method->getMinRequiredArguments();
Ahmed Charles13a140c2012-02-25 11:00:22 +00005707 if (Args.size() < MinRequiredArgs) {
Douglas Gregor96176b32008-11-18 23:14:02 +00005708 // Not enough arguments.
5709 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005710 Candidate.FailureKind = ovl_fail_too_few_arguments;
Douglas Gregor96176b32008-11-18 23:14:02 +00005711 return;
5712 }
5713
5714 Candidate.Viable = true;
Douglas Gregor96176b32008-11-18 23:14:02 +00005715
John McCall701c89e2009-12-03 04:06:58 +00005716 if (Method->isStatic() || ObjectType.isNull())
Douglas Gregor88a35142008-12-22 05:46:06 +00005717 // The implicit object argument is ignored.
5718 Candidate.IgnoreObjectArgument = true;
5719 else {
5720 // Determine the implicit conversion sequence for the object
5721 // parameter.
John McCall701c89e2009-12-03 04:06:58 +00005722 Candidate.Conversions[0]
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00005723 = TryObjectArgumentInitialization(*this, ObjectType, ObjectClassification,
5724 Method, ActingContext);
John McCall1d318332010-01-12 00:44:57 +00005725 if (Candidate.Conversions[0].isBad()) {
Douglas Gregor88a35142008-12-22 05:46:06 +00005726 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005727 Candidate.FailureKind = ovl_fail_bad_conversion;
Douglas Gregor88a35142008-12-22 05:46:06 +00005728 return;
5729 }
Douglas Gregor96176b32008-11-18 23:14:02 +00005730 }
5731
5732 // Determine the implicit conversion sequences for each of the
5733 // arguments.
Ahmed Charles13a140c2012-02-25 11:00:22 +00005734 for (unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
Douglas Gregor96176b32008-11-18 23:14:02 +00005735 if (ArgIdx < NumArgsInProto) {
5736 // (C++ 13.3.2p3): for F to be a viable function, there shall
5737 // exist for each argument an implicit conversion sequence
5738 // (13.3.3.1) that converts that argument to the corresponding
5739 // parameter of F.
5740 QualType ParamType = Proto->getArgType(ArgIdx);
Mike Stump1eb44332009-09-09 15:08:12 +00005741 Candidate.Conversions[ArgIdx + 1]
Douglas Gregor74eb6582010-04-16 17:51:22 +00005742 = TryCopyInitialization(*this, Args[ArgIdx], ParamType,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005743 SuppressUserConversions,
John McCallf85e1932011-06-15 23:02:42 +00005744 /*InOverloadResolution=*/true,
5745 /*AllowObjCWritebackConversion=*/
David Blaikie4e4d0842012-03-11 07:00:24 +00005746 getLangOpts().ObjCAutoRefCount);
John McCall1d318332010-01-12 00:44:57 +00005747 if (Candidate.Conversions[ArgIdx + 1].isBad()) {
Douglas Gregor96176b32008-11-18 23:14:02 +00005748 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005749 Candidate.FailureKind = ovl_fail_bad_conversion;
Douglas Gregor96176b32008-11-18 23:14:02 +00005750 break;
5751 }
5752 } else {
5753 // (C++ 13.3.2p2): For the purposes of overload resolution, any
5754 // argument for which there is no corresponding parameter is
5755 // considered to ""match the ellipsis" (C+ 13.3.3.1.3).
John McCall1d318332010-01-12 00:44:57 +00005756 Candidate.Conversions[ArgIdx + 1].setEllipsis();
Douglas Gregor96176b32008-11-18 23:14:02 +00005757 }
5758 }
5759}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005760
Douglas Gregor6b906862009-08-21 00:16:32 +00005761/// \brief Add a C++ member function template as a candidate to the candidate
5762/// set, using template argument deduction to produce an appropriate member
5763/// function template specialization.
Mike Stump1eb44332009-09-09 15:08:12 +00005764void
Douglas Gregor6b906862009-08-21 00:16:32 +00005765Sema::AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl,
John McCall9aa472c2010-03-19 07:35:19 +00005766 DeclAccessPair FoundDecl,
John McCall701c89e2009-12-03 04:06:58 +00005767 CXXRecordDecl *ActingContext,
Douglas Gregor67714232011-03-03 02:41:12 +00005768 TemplateArgumentListInfo *ExplicitTemplateArgs,
John McCall701c89e2009-12-03 04:06:58 +00005769 QualType ObjectType,
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00005770 Expr::Classification ObjectClassification,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005771 ArrayRef<Expr *> Args,
Douglas Gregor6b906862009-08-21 00:16:32 +00005772 OverloadCandidateSet& CandidateSet,
Douglas Gregor7ec77522010-04-16 17:33:27 +00005773 bool SuppressUserConversions) {
Douglas Gregor3f396022009-09-28 04:47:19 +00005774 if (!CandidateSet.isNewCandidate(MethodTmpl))
5775 return;
5776
Douglas Gregor6b906862009-08-21 00:16:32 +00005777 // C++ [over.match.funcs]p7:
Mike Stump1eb44332009-09-09 15:08:12 +00005778 // In each case where a candidate is a function template, candidate
Douglas Gregor6b906862009-08-21 00:16:32 +00005779 // function template specializations are generated using template argument
Mike Stump1eb44332009-09-09 15:08:12 +00005780 // deduction (14.8.3, 14.8.2). Those candidates are then handled as
Douglas Gregor6b906862009-08-21 00:16:32 +00005781 // candidate functions in the usual way.113) A given name can refer to one
5782 // or more function templates and also to a set of overloaded non-template
5783 // functions. In such a case, the candidate functions generated from each
5784 // function template are combined with the set of non-template candidate
5785 // functions.
Craig Topper93e45992012-09-19 02:26:47 +00005786 TemplateDeductionInfo Info(CandidateSet.getLocation());
Douglas Gregor6b906862009-08-21 00:16:32 +00005787 FunctionDecl *Specialization = 0;
5788 if (TemplateDeductionResult Result
Ahmed Charles13a140c2012-02-25 11:00:22 +00005789 = DeduceTemplateArguments(MethodTmpl, ExplicitTemplateArgs, Args,
5790 Specialization, Info)) {
Benjamin Kramer0e6a16f2012-01-14 16:31:55 +00005791 OverloadCandidate &Candidate = CandidateSet.addCandidate();
Douglas Gregorff5adac2010-05-08 20:18:54 +00005792 Candidate.FoundDecl = FoundDecl;
5793 Candidate.Function = MethodTmpl->getTemplatedDecl();
5794 Candidate.Viable = false;
5795 Candidate.FailureKind = ovl_fail_bad_deduction;
5796 Candidate.IsSurrogate = false;
5797 Candidate.IgnoreObjectArgument = false;
Ahmed Charles13a140c2012-02-25 11:00:22 +00005798 Candidate.ExplicitCallArguments = Args.size();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005799 Candidate.DeductionFailure = MakeDeductionFailureInfo(Context, Result,
Douglas Gregorff5adac2010-05-08 20:18:54 +00005800 Info);
5801 return;
5802 }
Mike Stump1eb44332009-09-09 15:08:12 +00005803
Douglas Gregor6b906862009-08-21 00:16:32 +00005804 // Add the function template specialization produced by template argument
5805 // deduction as a candidate.
5806 assert(Specialization && "Missing member function template specialization?");
Mike Stump1eb44332009-09-09 15:08:12 +00005807 assert(isa<CXXMethodDecl>(Specialization) &&
Douglas Gregor6b906862009-08-21 00:16:32 +00005808 "Specialization is not a member function?");
John McCall9aa472c2010-03-19 07:35:19 +00005809 AddMethodCandidate(cast<CXXMethodDecl>(Specialization), FoundDecl,
Ahmed Charles13a140c2012-02-25 11:00:22 +00005810 ActingContext, ObjectType, ObjectClassification, Args,
5811 CandidateSet, SuppressUserConversions);
Douglas Gregor6b906862009-08-21 00:16:32 +00005812}
5813
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00005814/// \brief Add a C++ function template specialization as a candidate
5815/// in the candidate set, using template argument deduction to produce
5816/// an appropriate function template specialization.
Mike Stump1eb44332009-09-09 15:08:12 +00005817void
Douglas Gregore53060f2009-06-25 22:08:12 +00005818Sema::AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate,
John McCall9aa472c2010-03-19 07:35:19 +00005819 DeclAccessPair FoundDecl,
Douglas Gregor67714232011-03-03 02:41:12 +00005820 TemplateArgumentListInfo *ExplicitTemplateArgs,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005821 ArrayRef<Expr *> Args,
Douglas Gregore53060f2009-06-25 22:08:12 +00005822 OverloadCandidateSet& CandidateSet,
Douglas Gregor7ec77522010-04-16 17:33:27 +00005823 bool SuppressUserConversions) {
Douglas Gregor3f396022009-09-28 04:47:19 +00005824 if (!CandidateSet.isNewCandidate(FunctionTemplate))
5825 return;
5826
Douglas Gregore53060f2009-06-25 22:08:12 +00005827 // C++ [over.match.funcs]p7:
Mike Stump1eb44332009-09-09 15:08:12 +00005828 // In each case where a candidate is a function template, candidate
Douglas Gregore53060f2009-06-25 22:08:12 +00005829 // function template specializations are generated using template argument
Mike Stump1eb44332009-09-09 15:08:12 +00005830 // deduction (14.8.3, 14.8.2). Those candidates are then handled as
Douglas Gregore53060f2009-06-25 22:08:12 +00005831 // candidate functions in the usual way.113) A given name can refer to one
5832 // or more function templates and also to a set of overloaded non-template
5833 // functions. In such a case, the candidate functions generated from each
5834 // function template are combined with the set of non-template candidate
5835 // functions.
Craig Topper93e45992012-09-19 02:26:47 +00005836 TemplateDeductionInfo Info(CandidateSet.getLocation());
Douglas Gregore53060f2009-06-25 22:08:12 +00005837 FunctionDecl *Specialization = 0;
5838 if (TemplateDeductionResult Result
Ahmed Charles13a140c2012-02-25 11:00:22 +00005839 = DeduceTemplateArguments(FunctionTemplate, ExplicitTemplateArgs, Args,
5840 Specialization, Info)) {
Benjamin Kramer0e6a16f2012-01-14 16:31:55 +00005841 OverloadCandidate &Candidate = CandidateSet.addCandidate();
John McCall9aa472c2010-03-19 07:35:19 +00005842 Candidate.FoundDecl = FoundDecl;
John McCall578b69b2009-12-16 08:11:27 +00005843 Candidate.Function = FunctionTemplate->getTemplatedDecl();
5844 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005845 Candidate.FailureKind = ovl_fail_bad_deduction;
John McCall578b69b2009-12-16 08:11:27 +00005846 Candidate.IsSurrogate = false;
5847 Candidate.IgnoreObjectArgument = false;
Ahmed Charles13a140c2012-02-25 11:00:22 +00005848 Candidate.ExplicitCallArguments = Args.size();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005849 Candidate.DeductionFailure = MakeDeductionFailureInfo(Context, Result,
Douglas Gregorff5adac2010-05-08 20:18:54 +00005850 Info);
Douglas Gregore53060f2009-06-25 22:08:12 +00005851 return;
5852 }
Mike Stump1eb44332009-09-09 15:08:12 +00005853
Douglas Gregore53060f2009-06-25 22:08:12 +00005854 // Add the function template specialization produced by template argument
5855 // deduction as a candidate.
5856 assert(Specialization && "Missing function template specialization?");
Ahmed Charles13a140c2012-02-25 11:00:22 +00005857 AddOverloadCandidate(Specialization, FoundDecl, Args, CandidateSet,
Douglas Gregor7ec77522010-04-16 17:33:27 +00005858 SuppressUserConversions);
Douglas Gregore53060f2009-06-25 22:08:12 +00005859}
Mike Stump1eb44332009-09-09 15:08:12 +00005860
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005861/// AddConversionCandidate - Add a C++ conversion function as a
Mike Stump1eb44332009-09-09 15:08:12 +00005862/// candidate in the candidate set (C++ [over.match.conv],
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005863/// C++ [over.match.copy]). From is the expression we're converting from,
Mike Stump1eb44332009-09-09 15:08:12 +00005864/// and ToType is the type that we're eventually trying to convert to
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005865/// (which may or may not be the same type as the type that the
5866/// conversion function produces).
5867void
5868Sema::AddConversionCandidate(CXXConversionDecl *Conversion,
John McCall9aa472c2010-03-19 07:35:19 +00005869 DeclAccessPair FoundDecl,
John McCall701c89e2009-12-03 04:06:58 +00005870 CXXRecordDecl *ActingContext,
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005871 Expr *From, QualType ToType,
5872 OverloadCandidateSet& CandidateSet) {
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00005873 assert(!Conversion->getDescribedFunctionTemplate() &&
5874 "Conversion function templates use AddTemplateConversionCandidate");
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00005875 QualType ConvType = Conversion->getConversionType().getNonReferenceType();
Douglas Gregor3f396022009-09-28 04:47:19 +00005876 if (!CandidateSet.isNewCandidate(Conversion))
5877 return;
5878
Richard Smith60e141e2013-05-04 07:00:32 +00005879 // If the conversion function has an undeduced return type, trigger its
5880 // deduction now.
5881 if (getLangOpts().CPlusPlus1y && ConvType->isUndeducedType()) {
5882 if (DeduceReturnType(Conversion, From->getExprLoc()))
5883 return;
5884 ConvType = Conversion->getConversionType().getNonReferenceType();
5885 }
5886
Douglas Gregor7edfb692009-11-23 12:27:39 +00005887 // Overload resolution is always an unevaluated context.
John McCallf312b1e2010-08-26 23:41:50 +00005888 EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated);
Douglas Gregor7edfb692009-11-23 12:27:39 +00005889
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005890 // Add this candidate
Benjamin Kramer0e6a16f2012-01-14 16:31:55 +00005891 OverloadCandidate &Candidate = CandidateSet.addCandidate(1);
John McCall9aa472c2010-03-19 07:35:19 +00005892 Candidate.FoundDecl = FoundDecl;
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005893 Candidate.Function = Conversion;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00005894 Candidate.IsSurrogate = false;
Douglas Gregor88a35142008-12-22 05:46:06 +00005895 Candidate.IgnoreObjectArgument = false;
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005896 Candidate.FinalConversion.setAsIdentityConversion();
Douglas Gregor3fbaf3e2010-04-17 22:01:05 +00005897 Candidate.FinalConversion.setFromType(ConvType);
Douglas Gregorad323a82010-01-27 03:51:04 +00005898 Candidate.FinalConversion.setAllToTypes(ToType);
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005899 Candidate.Viable = true;
Douglas Gregordfc331e2011-01-19 23:54:39 +00005900 Candidate.ExplicitCallArguments = 1;
Douglas Gregorc774b2f2010-08-19 15:57:50 +00005901
Douglas Gregorbca39322010-08-19 15:37:02 +00005902 // C++ [over.match.funcs]p4:
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005903 // For conversion functions, the function is considered to be a member of
5904 // the class of the implicit implied object argument for the purpose of
Douglas Gregorbca39322010-08-19 15:37:02 +00005905 // defining the type of the implicit object parameter.
Douglas Gregorc774b2f2010-08-19 15:57:50 +00005906 //
5907 // Determine the implicit conversion sequence for the implicit
5908 // object parameter.
5909 QualType ImplicitParamType = From->getType();
5910 if (const PointerType *FromPtrType = ImplicitParamType->getAs<PointerType>())
5911 ImplicitParamType = FromPtrType->getPointeeType();
5912 CXXRecordDecl *ConversionContext
5913 = cast<CXXRecordDecl>(ImplicitParamType->getAs<RecordType>()->getDecl());
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005914
Douglas Gregorc774b2f2010-08-19 15:57:50 +00005915 Candidate.Conversions[0]
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005916 = TryObjectArgumentInitialization(*this, From->getType(),
5917 From->Classify(Context),
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00005918 Conversion, ConversionContext);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005919
John McCall1d318332010-01-12 00:44:57 +00005920 if (Candidate.Conversions[0].isBad()) {
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005921 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00005922 Candidate.FailureKind = ovl_fail_bad_conversion;
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005923 return;
5924 }
Douglas Gregorc774b2f2010-08-19 15:57:50 +00005925
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005926 // We won't go through a user-define type conversion function to convert a
Fariborz Jahanian3759a032009-10-19 19:18:20 +00005927 // derived to base as such conversions are given Conversion Rank. They only
5928 // go through a copy constructor. 13.3.3.1.2-p4 [over.ics.user]
5929 QualType FromCanon
5930 = Context.getCanonicalType(From->getType().getUnqualifiedType());
5931 QualType ToCanon = Context.getCanonicalType(ToType).getUnqualifiedType();
5932 if (FromCanon == ToCanon || IsDerivedFrom(FromCanon, ToCanon)) {
5933 Candidate.Viable = false;
John McCall717e8912010-01-23 05:17:32 +00005934 Candidate.FailureKind = ovl_fail_trivial_conversion;
Fariborz Jahanian3759a032009-10-19 19:18:20 +00005935 return;
5936 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005937
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005938 // To determine what the conversion from the result of calling the
5939 // conversion function to the type we're eventually trying to
5940 // convert to (ToType), we need to synthesize a call to the
5941 // conversion function and attempt copy initialization from it. This
5942 // makes sure that we get the right semantics with respect to
5943 // lvalues/rvalues and the type. Fortunately, we can allocate this
5944 // call on the stack and we don't need its arguments to be
5945 // well-formed.
John McCallf4b88a42012-03-10 09:33:50 +00005946 DeclRefExpr ConversionRef(Conversion, false, Conversion->getType(),
John McCallf89e55a2010-11-18 06:31:45 +00005947 VK_LValue, From->getLocStart());
John McCallf871d0c2010-08-07 06:22:56 +00005948 ImplicitCastExpr ConversionFn(ImplicitCastExpr::OnStack,
5949 Context.getPointerType(Conversion->getType()),
John McCall2de56d12010-08-25 11:45:40 +00005950 CK_FunctionToPointerDecay,
John McCall5baba9d2010-08-25 10:28:54 +00005951 &ConversionRef, VK_RValue);
Mike Stump1eb44332009-09-09 15:08:12 +00005952
Richard Smith87c1f1f2011-07-13 22:53:21 +00005953 QualType ConversionType = Conversion->getConversionType();
5954 if (RequireCompleteType(From->getLocStart(), ConversionType, 0)) {
Douglas Gregor7d14d382010-11-13 19:36:57 +00005955 Candidate.Viable = false;
5956 Candidate.FailureKind = ovl_fail_bad_final_conversion;
5957 return;
5958 }
5959
Richard Smith87c1f1f2011-07-13 22:53:21 +00005960 ExprValueKind VK = Expr::getValueKindForType(ConversionType);
John McCallf89e55a2010-11-18 06:31:45 +00005961
Mike Stump1eb44332009-09-09 15:08:12 +00005962 // Note that it is safe to allocate CallExpr on the stack here because
Ted Kremenek668bf912009-02-09 20:51:47 +00005963 // there are 0 arguments (i.e., nothing is allocated using ASTContext's
5964 // allocator).
Richard Smith87c1f1f2011-07-13 22:53:21 +00005965 QualType CallResultType = ConversionType.getNonLValueExprType(Context);
Dmitri Gribenko62ed8892013-05-05 20:40:26 +00005966 CallExpr Call(Context, &ConversionFn, None, CallResultType, VK,
Douglas Gregor0a0d1ac2009-11-17 21:16:22 +00005967 From->getLocStart());
Mike Stump1eb44332009-09-09 15:08:12 +00005968 ImplicitConversionSequence ICS =
Douglas Gregor74eb6582010-04-16 17:51:22 +00005969 TryCopyInitialization(*this, &Call, ToType,
Anders Carlssond28b4282009-08-27 17:18:13 +00005970 /*SuppressUserConversions=*/true,
John McCallf85e1932011-06-15 23:02:42 +00005971 /*InOverloadResolution=*/false,
5972 /*AllowObjCWritebackConversion=*/false);
Mike Stump1eb44332009-09-09 15:08:12 +00005973
John McCall1d318332010-01-12 00:44:57 +00005974 switch (ICS.getKind()) {
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005975 case ImplicitConversionSequence::StandardConversion:
5976 Candidate.FinalConversion = ICS.Standard;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005977
Douglas Gregorc520c842010-04-12 23:42:09 +00005978 // C++ [over.ics.user]p3:
5979 // If the user-defined conversion is specified by a specialization of a
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005980 // conversion function template, the second standard conversion sequence
Douglas Gregorc520c842010-04-12 23:42:09 +00005981 // shall have exact match rank.
5982 if (Conversion->getPrimaryTemplate() &&
5983 GetConversionRank(ICS.Standard.Second) != ICR_Exact_Match) {
5984 Candidate.Viable = false;
5985 Candidate.FailureKind = ovl_fail_final_conversion_not_exact;
5986 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005987
Douglas Gregor2ad746a2011-01-21 05:18:22 +00005988 // C++0x [dcl.init.ref]p5:
5989 // In the second case, if the reference is an rvalue reference and
5990 // the second standard conversion sequence of the user-defined
5991 // conversion sequence includes an lvalue-to-rvalue conversion, the
5992 // program is ill-formed.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00005993 if (ToType->isRValueReferenceType() &&
Douglas Gregor2ad746a2011-01-21 05:18:22 +00005994 ICS.Standard.First == ICK_Lvalue_To_Rvalue) {
5995 Candidate.Viable = false;
5996 Candidate.FailureKind = ovl_fail_bad_final_conversion;
5997 }
Douglas Gregorf1991ea2008-11-07 22:36:19 +00005998 break;
5999
6000 case ImplicitConversionSequence::BadConversion:
6001 Candidate.Viable = false;
John McCall717e8912010-01-23 05:17:32 +00006002 Candidate.FailureKind = ovl_fail_bad_final_conversion;
Douglas Gregorf1991ea2008-11-07 22:36:19 +00006003 break;
6004
6005 default:
David Blaikieb219cfc2011-09-23 05:06:16 +00006006 llvm_unreachable(
Douglas Gregorf1991ea2008-11-07 22:36:19 +00006007 "Can only end up with a standard conversion sequence or failure");
6008 }
6009}
6010
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006011/// \brief Adds a conversion function template specialization
6012/// candidate to the overload set, using template argument deduction
6013/// to deduce the template arguments of the conversion function
6014/// template from the type that we are converting to (C++
6015/// [temp.deduct.conv]).
Mike Stump1eb44332009-09-09 15:08:12 +00006016void
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006017Sema::AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate,
John McCall9aa472c2010-03-19 07:35:19 +00006018 DeclAccessPair FoundDecl,
John McCall701c89e2009-12-03 04:06:58 +00006019 CXXRecordDecl *ActingDC,
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006020 Expr *From, QualType ToType,
6021 OverloadCandidateSet &CandidateSet) {
6022 assert(isa<CXXConversionDecl>(FunctionTemplate->getTemplatedDecl()) &&
6023 "Only conversion function templates permitted here");
6024
Douglas Gregor3f396022009-09-28 04:47:19 +00006025 if (!CandidateSet.isNewCandidate(FunctionTemplate))
6026 return;
6027
Craig Topper93e45992012-09-19 02:26:47 +00006028 TemplateDeductionInfo Info(CandidateSet.getLocation());
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006029 CXXConversionDecl *Specialization = 0;
6030 if (TemplateDeductionResult Result
Mike Stump1eb44332009-09-09 15:08:12 +00006031 = DeduceTemplateArguments(FunctionTemplate, ToType,
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006032 Specialization, Info)) {
Benjamin Kramer0e6a16f2012-01-14 16:31:55 +00006033 OverloadCandidate &Candidate = CandidateSet.addCandidate();
Douglas Gregorff5adac2010-05-08 20:18:54 +00006034 Candidate.FoundDecl = FoundDecl;
6035 Candidate.Function = FunctionTemplate->getTemplatedDecl();
6036 Candidate.Viable = false;
6037 Candidate.FailureKind = ovl_fail_bad_deduction;
6038 Candidate.IsSurrogate = false;
6039 Candidate.IgnoreObjectArgument = false;
Douglas Gregordfc331e2011-01-19 23:54:39 +00006040 Candidate.ExplicitCallArguments = 1;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006041 Candidate.DeductionFailure = MakeDeductionFailureInfo(Context, Result,
Douglas Gregorff5adac2010-05-08 20:18:54 +00006042 Info);
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006043 return;
6044 }
Mike Stump1eb44332009-09-09 15:08:12 +00006045
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006046 // Add the conversion function template specialization produced by
6047 // template argument deduction as a candidate.
6048 assert(Specialization && "Missing function template specialization?");
John McCall9aa472c2010-03-19 07:35:19 +00006049 AddConversionCandidate(Specialization, FoundDecl, ActingDC, From, ToType,
John McCall86820f52010-01-26 01:37:31 +00006050 CandidateSet);
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006051}
6052
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006053/// AddSurrogateCandidate - Adds a "surrogate" candidate function that
6054/// converts the given @c Object to a function pointer via the
6055/// conversion function @c Conversion, and then attempts to call it
6056/// with the given arguments (C++ [over.call.object]p2-4). Proto is
6057/// the type of function that we'll eventually be calling.
6058void Sema::AddSurrogateCandidate(CXXConversionDecl *Conversion,
John McCall9aa472c2010-03-19 07:35:19 +00006059 DeclAccessPair FoundDecl,
John McCall701c89e2009-12-03 04:06:58 +00006060 CXXRecordDecl *ActingContext,
Douglas Gregor72564e72009-02-26 23:50:07 +00006061 const FunctionProtoType *Proto,
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00006062 Expr *Object,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00006063 ArrayRef<Expr *> Args,
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006064 OverloadCandidateSet& CandidateSet) {
Douglas Gregor3f396022009-09-28 04:47:19 +00006065 if (!CandidateSet.isNewCandidate(Conversion))
6066 return;
6067
Douglas Gregor7edfb692009-11-23 12:27:39 +00006068 // Overload resolution is always an unevaluated context.
John McCallf312b1e2010-08-26 23:41:50 +00006069 EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated);
Douglas Gregor7edfb692009-11-23 12:27:39 +00006070
Ahmed Charles13a140c2012-02-25 11:00:22 +00006071 OverloadCandidate &Candidate = CandidateSet.addCandidate(Args.size() + 1);
John McCall9aa472c2010-03-19 07:35:19 +00006072 Candidate.FoundDecl = FoundDecl;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006073 Candidate.Function = 0;
6074 Candidate.Surrogate = Conversion;
6075 Candidate.Viable = true;
6076 Candidate.IsSurrogate = true;
Douglas Gregor88a35142008-12-22 05:46:06 +00006077 Candidate.IgnoreObjectArgument = false;
Ahmed Charles13a140c2012-02-25 11:00:22 +00006078 Candidate.ExplicitCallArguments = Args.size();
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006079
6080 // Determine the implicit conversion sequence for the implicit
6081 // object parameter.
Mike Stump1eb44332009-09-09 15:08:12 +00006082 ImplicitConversionSequence ObjectInit
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006083 = TryObjectArgumentInitialization(*this, Object->getType(),
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00006084 Object->Classify(Context),
6085 Conversion, ActingContext);
John McCall1d318332010-01-12 00:44:57 +00006086 if (ObjectInit.isBad()) {
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006087 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00006088 Candidate.FailureKind = ovl_fail_bad_conversion;
John McCall717e8912010-01-23 05:17:32 +00006089 Candidate.Conversions[0] = ObjectInit;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006090 return;
6091 }
6092
6093 // The first conversion is actually a user-defined conversion whose
6094 // first conversion is ObjectInit's standard conversion (which is
6095 // effectively a reference binding). Record it as such.
John McCall1d318332010-01-12 00:44:57 +00006096 Candidate.Conversions[0].setUserDefined();
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006097 Candidate.Conversions[0].UserDefined.Before = ObjectInit.Standard;
Fariborz Jahanian966256a2009-11-06 00:23:08 +00006098 Candidate.Conversions[0].UserDefined.EllipsisConversion = false;
Abramo Bagnara7cc58b42011-10-05 07:56:41 +00006099 Candidate.Conversions[0].UserDefined.HadMultipleCandidates = false;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006100 Candidate.Conversions[0].UserDefined.ConversionFunction = Conversion;
John McCallca82a822011-09-21 08:36:56 +00006101 Candidate.Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
Mike Stump1eb44332009-09-09 15:08:12 +00006102 Candidate.Conversions[0].UserDefined.After
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006103 = Candidate.Conversions[0].UserDefined.Before;
6104 Candidate.Conversions[0].UserDefined.After.setAsIdentityConversion();
6105
Mike Stump1eb44332009-09-09 15:08:12 +00006106 // Find the
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006107 unsigned NumArgsInProto = Proto->getNumArgs();
6108
6109 // (C++ 13.3.2p2): A candidate function having fewer than m
6110 // parameters is viable only if it has an ellipsis in its parameter
6111 // list (8.3.5).
Ahmed Charles13a140c2012-02-25 11:00:22 +00006112 if (Args.size() > NumArgsInProto && !Proto->isVariadic()) {
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006113 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00006114 Candidate.FailureKind = ovl_fail_too_many_arguments;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006115 return;
6116 }
6117
6118 // Function types don't have any default arguments, so just check if
6119 // we have enough arguments.
Ahmed Charles13a140c2012-02-25 11:00:22 +00006120 if (Args.size() < NumArgsInProto) {
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006121 // Not enough arguments.
6122 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00006123 Candidate.FailureKind = ovl_fail_too_few_arguments;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006124 return;
6125 }
6126
6127 // Determine the implicit conversion sequences for each of the
6128 // arguments.
Richard Smith958ba642013-05-05 15:51:06 +00006129 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006130 if (ArgIdx < NumArgsInProto) {
6131 // (C++ 13.3.2p3): for F to be a viable function, there shall
6132 // exist for each argument an implicit conversion sequence
6133 // (13.3.3.1) that converts that argument to the corresponding
6134 // parameter of F.
6135 QualType ParamType = Proto->getArgType(ArgIdx);
Mike Stump1eb44332009-09-09 15:08:12 +00006136 Candidate.Conversions[ArgIdx + 1]
Douglas Gregor74eb6582010-04-16 17:51:22 +00006137 = TryCopyInitialization(*this, Args[ArgIdx], ParamType,
Anders Carlssond28b4282009-08-27 17:18:13 +00006138 /*SuppressUserConversions=*/false,
John McCallf85e1932011-06-15 23:02:42 +00006139 /*InOverloadResolution=*/false,
6140 /*AllowObjCWritebackConversion=*/
David Blaikie4e4d0842012-03-11 07:00:24 +00006141 getLangOpts().ObjCAutoRefCount);
John McCall1d318332010-01-12 00:44:57 +00006142 if (Candidate.Conversions[ArgIdx + 1].isBad()) {
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006143 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00006144 Candidate.FailureKind = ovl_fail_bad_conversion;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006145 break;
6146 }
6147 } else {
6148 // (C++ 13.3.2p2): For the purposes of overload resolution, any
6149 // argument for which there is no corresponding parameter is
6150 // considered to ""match the ellipsis" (C+ 13.3.3.1.3).
John McCall1d318332010-01-12 00:44:57 +00006151 Candidate.Conversions[ArgIdx + 1].setEllipsis();
Douglas Gregor106c6eb2008-11-19 22:57:39 +00006152 }
6153 }
6154}
6155
Douglas Gregor063daf62009-03-13 18:40:31 +00006156/// \brief Add overload candidates for overloaded operators that are
6157/// member functions.
6158///
6159/// Add the overloaded operator candidates that are member functions
6160/// for the operator Op that was used in an operator expression such
6161/// as "x Op y". , Args/NumArgs provides the operator arguments, and
6162/// CandidateSet will store the added overload candidates. (C++
6163/// [over.match.oper]).
6164void Sema::AddMemberOperatorCandidates(OverloadedOperatorKind Op,
6165 SourceLocation OpLoc,
Richard Smith958ba642013-05-05 15:51:06 +00006166 ArrayRef<Expr *> Args,
Douglas Gregor063daf62009-03-13 18:40:31 +00006167 OverloadCandidateSet& CandidateSet,
6168 SourceRange OpRange) {
Douglas Gregor96176b32008-11-18 23:14:02 +00006169 DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(Op);
6170
6171 // C++ [over.match.oper]p3:
6172 // For a unary operator @ with an operand of a type whose
6173 // cv-unqualified version is T1, and for a binary operator @ with
6174 // a left operand of a type whose cv-unqualified version is T1 and
6175 // a right operand of a type whose cv-unqualified version is T2,
6176 // three sets of candidate functions, designated member
6177 // candidates, non-member candidates and built-in candidates, are
6178 // constructed as follows:
6179 QualType T1 = Args[0]->getType();
Douglas Gregor96176b32008-11-18 23:14:02 +00006180
Richard Smithe410be92013-04-20 12:41:22 +00006181 // -- If T1 is a complete class type or a class currently being
6182 // defined, the set of member candidates is the result of the
6183 // qualified lookup of T1::operator@ (13.3.1.1.1); otherwise,
6184 // the set of member candidates is empty.
Ted Kremenek6217b802009-07-29 21:53:49 +00006185 if (const RecordType *T1Rec = T1->getAs<RecordType>()) {
Richard Smithe410be92013-04-20 12:41:22 +00006186 // Complete the type if it can be completed.
6187 RequireCompleteType(OpLoc, T1, 0);
6188 // If the type is neither complete nor being defined, bail out now.
6189 if (!T1Rec->getDecl()->getDefinition())
Douglas Gregor8a5ae242009-08-27 23:35:55 +00006190 return;
Mike Stump1eb44332009-09-09 15:08:12 +00006191
John McCalla24dc2e2009-11-17 02:14:36 +00006192 LookupResult Operators(*this, OpName, OpLoc, LookupOrdinaryName);
6193 LookupQualifiedName(Operators, T1Rec->getDecl());
6194 Operators.suppressDiagnostics();
6195
Mike Stump1eb44332009-09-09 15:08:12 +00006196 for (LookupResult::iterator Oper = Operators.begin(),
Douglas Gregor8a5ae242009-08-27 23:35:55 +00006197 OperEnd = Operators.end();
6198 Oper != OperEnd;
John McCall314be4e2009-11-17 07:50:12 +00006199 ++Oper)
John McCall9aa472c2010-03-19 07:35:19 +00006200 AddMethodCandidate(Oper.getPair(), Args[0]->getType(),
Rafael Espindola548107e2013-04-29 19:29:25 +00006201 Args[0]->Classify(Context),
Richard Smith958ba642013-05-05 15:51:06 +00006202 Args.slice(1),
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00006203 CandidateSet,
John McCall314be4e2009-11-17 07:50:12 +00006204 /* SuppressUserConversions = */ false);
Douglas Gregor96176b32008-11-18 23:14:02 +00006205 }
Douglas Gregor96176b32008-11-18 23:14:02 +00006206}
6207
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006208/// AddBuiltinCandidate - Add a candidate for a built-in
6209/// operator. ResultTy and ParamTys are the result and parameter types
6210/// of the built-in candidate, respectively. Args and NumArgs are the
Douglas Gregor88b4bf22009-01-13 00:52:54 +00006211/// arguments being passed to the candidate. IsAssignmentOperator
6212/// should be true when this built-in candidate is an assignment
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006213/// operator. NumContextualBoolArguments is the number of arguments
6214/// (at the beginning of the argument list) that will be contextually
6215/// converted to bool.
Mike Stump1eb44332009-09-09 15:08:12 +00006216void Sema::AddBuiltinCandidate(QualType ResultTy, QualType *ParamTys,
Richard Smith958ba642013-05-05 15:51:06 +00006217 ArrayRef<Expr *> Args,
Douglas Gregor88b4bf22009-01-13 00:52:54 +00006218 OverloadCandidateSet& CandidateSet,
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006219 bool IsAssignmentOperator,
6220 unsigned NumContextualBoolArguments) {
Douglas Gregor7edfb692009-11-23 12:27:39 +00006221 // Overload resolution is always an unevaluated context.
John McCallf312b1e2010-08-26 23:41:50 +00006222 EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated);
Douglas Gregor7edfb692009-11-23 12:27:39 +00006223
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006224 // Add this candidate
Richard Smith958ba642013-05-05 15:51:06 +00006225 OverloadCandidate &Candidate = CandidateSet.addCandidate(Args.size());
John McCall9aa472c2010-03-19 07:35:19 +00006226 Candidate.FoundDecl = DeclAccessPair::make(0, AS_none);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006227 Candidate.Function = 0;
Douglas Gregorc9467cf2008-12-12 02:00:36 +00006228 Candidate.IsSurrogate = false;
Douglas Gregor88a35142008-12-22 05:46:06 +00006229 Candidate.IgnoreObjectArgument = false;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006230 Candidate.BuiltinTypes.ResultTy = ResultTy;
Richard Smith958ba642013-05-05 15:51:06 +00006231 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx)
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006232 Candidate.BuiltinTypes.ParamTypes[ArgIdx] = ParamTys[ArgIdx];
6233
6234 // Determine the implicit conversion sequences for each of the
6235 // arguments.
6236 Candidate.Viable = true;
Richard Smith958ba642013-05-05 15:51:06 +00006237 Candidate.ExplicitCallArguments = Args.size();
6238 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
Douglas Gregor88b4bf22009-01-13 00:52:54 +00006239 // C++ [over.match.oper]p4:
6240 // For the built-in assignment operators, conversions of the
6241 // left operand are restricted as follows:
6242 // -- no temporaries are introduced to hold the left operand, and
6243 // -- no user-defined conversions are applied to the left
6244 // operand to achieve a type match with the left-most
Mike Stump1eb44332009-09-09 15:08:12 +00006245 // parameter of a built-in candidate.
Douglas Gregor88b4bf22009-01-13 00:52:54 +00006246 //
6247 // We block these conversions by turning off user-defined
6248 // conversions, since that is the only way that initialization of
6249 // a reference to a non-class type can occur from something that
6250 // is not of the same type.
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006251 if (ArgIdx < NumContextualBoolArguments) {
Mike Stump1eb44332009-09-09 15:08:12 +00006252 assert(ParamTys[ArgIdx] == Context.BoolTy &&
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006253 "Contextual conversion to bool requires bool type");
John McCall120d63c2010-08-24 20:38:10 +00006254 Candidate.Conversions[ArgIdx]
6255 = TryContextuallyConvertToBool(*this, Args[ArgIdx]);
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006256 } else {
Mike Stump1eb44332009-09-09 15:08:12 +00006257 Candidate.Conversions[ArgIdx]
Douglas Gregor74eb6582010-04-16 17:51:22 +00006258 = TryCopyInitialization(*this, Args[ArgIdx], ParamTys[ArgIdx],
Anders Carlssond28b4282009-08-27 17:18:13 +00006259 ArgIdx == 0 && IsAssignmentOperator,
John McCallf85e1932011-06-15 23:02:42 +00006260 /*InOverloadResolution=*/false,
6261 /*AllowObjCWritebackConversion=*/
David Blaikie4e4d0842012-03-11 07:00:24 +00006262 getLangOpts().ObjCAutoRefCount);
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006263 }
John McCall1d318332010-01-12 00:44:57 +00006264 if (Candidate.Conversions[ArgIdx].isBad()) {
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006265 Candidate.Viable = false;
John McCalladbb8f82010-01-13 09:16:55 +00006266 Candidate.FailureKind = ovl_fail_bad_conversion;
Douglas Gregor96176b32008-11-18 23:14:02 +00006267 break;
6268 }
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006269 }
6270}
6271
6272/// BuiltinCandidateTypeSet - A set of types that will be used for the
6273/// candidate operator functions for built-in operators (C++
6274/// [over.built]). The types are separated into pointer types and
6275/// enumeration types.
6276class BuiltinCandidateTypeSet {
6277 /// TypeSet - A set of types.
Chris Lattnere37b94c2009-03-29 00:04:01 +00006278 typedef llvm::SmallPtrSet<QualType, 8> TypeSet;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006279
6280 /// PointerTypes - The set of pointer types that will be used in the
6281 /// built-in candidates.
6282 TypeSet PointerTypes;
6283
Sebastian Redl78eb8742009-04-19 21:53:20 +00006284 /// MemberPointerTypes - The set of member pointer types that will be
6285 /// used in the built-in candidates.
6286 TypeSet MemberPointerTypes;
6287
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006288 /// EnumerationTypes - The set of enumeration types that will be
6289 /// used in the built-in candidates.
6290 TypeSet EnumerationTypes;
6291
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006292 /// \brief The set of vector types that will be used in the built-in
Douglas Gregor26bcf672010-05-19 03:21:00 +00006293 /// candidates.
6294 TypeSet VectorTypes;
Chandler Carruth6a577462010-12-13 01:44:01 +00006295
6296 /// \brief A flag indicating non-record types are viable candidates
6297 bool HasNonRecordTypes;
6298
6299 /// \brief A flag indicating whether either arithmetic or enumeration types
6300 /// were present in the candidate set.
6301 bool HasArithmeticOrEnumeralTypes;
6302
Douglas Gregor84ee2ee2011-05-21 23:15:46 +00006303 /// \brief A flag indicating whether the nullptr type was present in the
6304 /// candidate set.
6305 bool HasNullPtrType;
6306
Douglas Gregor5842ba92009-08-24 15:23:48 +00006307 /// Sema - The semantic analysis instance where we are building the
6308 /// candidate type set.
6309 Sema &SemaRef;
Mike Stump1eb44332009-09-09 15:08:12 +00006310
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006311 /// Context - The AST context in which we will build the type sets.
6312 ASTContext &Context;
6313
Fariborz Jahanian1cad6022009-10-16 22:08:05 +00006314 bool AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
6315 const Qualifiers &VisibleQuals);
Sebastian Redl78eb8742009-04-19 21:53:20 +00006316 bool AddMemberPointerWithMoreQualifiedTypeVariants(QualType Ty);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006317
6318public:
6319 /// iterator - Iterates through the types that are part of the set.
Chris Lattnere37b94c2009-03-29 00:04:01 +00006320 typedef TypeSet::iterator iterator;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006321
Mike Stump1eb44332009-09-09 15:08:12 +00006322 BuiltinCandidateTypeSet(Sema &SemaRef)
Chandler Carruth6a577462010-12-13 01:44:01 +00006323 : HasNonRecordTypes(false),
6324 HasArithmeticOrEnumeralTypes(false),
Douglas Gregor84ee2ee2011-05-21 23:15:46 +00006325 HasNullPtrType(false),
Chandler Carruth6a577462010-12-13 01:44:01 +00006326 SemaRef(SemaRef),
6327 Context(SemaRef.Context) { }
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006328
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006329 void AddTypesConvertedFrom(QualType Ty,
Douglas Gregor573d9c32009-10-21 23:19:44 +00006330 SourceLocation Loc,
6331 bool AllowUserConversions,
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006332 bool AllowExplicitConversions,
6333 const Qualifiers &VisibleTypeConversionsQuals);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006334
6335 /// pointer_begin - First pointer type found;
6336 iterator pointer_begin() { return PointerTypes.begin(); }
6337
Sebastian Redl78eb8742009-04-19 21:53:20 +00006338 /// pointer_end - Past the last pointer type found;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006339 iterator pointer_end() { return PointerTypes.end(); }
6340
Sebastian Redl78eb8742009-04-19 21:53:20 +00006341 /// member_pointer_begin - First member pointer type found;
6342 iterator member_pointer_begin() { return MemberPointerTypes.begin(); }
6343
6344 /// member_pointer_end - Past the last member pointer type found;
6345 iterator member_pointer_end() { return MemberPointerTypes.end(); }
6346
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006347 /// enumeration_begin - First enumeration type found;
6348 iterator enumeration_begin() { return EnumerationTypes.begin(); }
6349
Sebastian Redl78eb8742009-04-19 21:53:20 +00006350 /// enumeration_end - Past the last enumeration type found;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006351 iterator enumeration_end() { return EnumerationTypes.end(); }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006352
Douglas Gregor26bcf672010-05-19 03:21:00 +00006353 iterator vector_begin() { return VectorTypes.begin(); }
6354 iterator vector_end() { return VectorTypes.end(); }
Chandler Carruth6a577462010-12-13 01:44:01 +00006355
6356 bool hasNonRecordTypes() { return HasNonRecordTypes; }
6357 bool hasArithmeticOrEnumeralTypes() { return HasArithmeticOrEnumeralTypes; }
Douglas Gregor84ee2ee2011-05-21 23:15:46 +00006358 bool hasNullPtrType() const { return HasNullPtrType; }
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006359};
6360
Sebastian Redl78eb8742009-04-19 21:53:20 +00006361/// AddPointerWithMoreQualifiedTypeVariants - Add the pointer type @p Ty to
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006362/// the set of pointer types along with any more-qualified variants of
6363/// that type. For example, if @p Ty is "int const *", this routine
6364/// will add "int const *", "int const volatile *", "int const
6365/// restrict *", and "int const volatile restrict *" to the set of
6366/// pointer types. Returns true if the add of @p Ty itself succeeded,
6367/// false otherwise.
John McCall0953e762009-09-24 19:53:00 +00006368///
6369/// FIXME: what to do about extended qualifiers?
Sebastian Redl78eb8742009-04-19 21:53:20 +00006370bool
Douglas Gregor573d9c32009-10-21 23:19:44 +00006371BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
6372 const Qualifiers &VisibleQuals) {
John McCall0953e762009-09-24 19:53:00 +00006373
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006374 // Insert this type.
Chris Lattnere37b94c2009-03-29 00:04:01 +00006375 if (!PointerTypes.insert(Ty))
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006376 return false;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006377
Fariborz Jahanian2e2acec2010-08-21 00:10:36 +00006378 QualType PointeeTy;
John McCall0953e762009-09-24 19:53:00 +00006379 const PointerType *PointerTy = Ty->getAs<PointerType>();
Fariborz Jahanian957b4df2010-08-21 17:11:09 +00006380 bool buildObjCPtr = false;
Fariborz Jahanian2e2acec2010-08-21 00:10:36 +00006381 if (!PointerTy) {
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006382 const ObjCObjectPointerType *PTy = Ty->castAs<ObjCObjectPointerType>();
6383 PointeeTy = PTy->getPointeeType();
6384 buildObjCPtr = true;
6385 } else {
Fariborz Jahanian2e2acec2010-08-21 00:10:36 +00006386 PointeeTy = PointerTy->getPointeeType();
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006387 }
6388
Sebastian Redla9efada2009-11-18 20:39:26 +00006389 // Don't add qualified variants of arrays. For one, they're not allowed
6390 // (the qualifier would sink to the element type), and for another, the
6391 // only overload situation where it matters is subscript or pointer +- int,
6392 // and those shouldn't have qualifier variants anyway.
6393 if (PointeeTy->isArrayType())
6394 return true;
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006395
John McCall0953e762009-09-24 19:53:00 +00006396 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
Fariborz Jahanian1cad6022009-10-16 22:08:05 +00006397 bool hasVolatile = VisibleQuals.hasVolatile();
6398 bool hasRestrict = VisibleQuals.hasRestrict();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006399
John McCall0953e762009-09-24 19:53:00 +00006400 // Iterate through all strict supersets of BaseCVR.
6401 for (unsigned CVR = BaseCVR+1; CVR <= Qualifiers::CVRMask; ++CVR) {
6402 if ((CVR | BaseCVR) != CVR) continue;
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006403 // Skip over volatile if no volatile found anywhere in the types.
Fariborz Jahanian1cad6022009-10-16 22:08:05 +00006404 if ((CVR & Qualifiers::Volatile) && !hasVolatile) continue;
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006405
6406 // Skip over restrict if no restrict found anywhere in the types, or if
6407 // the type cannot be restrict-qualified.
6408 if ((CVR & Qualifiers::Restrict) &&
6409 (!hasRestrict ||
6410 (!(PointeeTy->isAnyPointerType() || PointeeTy->isReferenceType()))))
6411 continue;
6412
6413 // Build qualified pointee type.
John McCall0953e762009-09-24 19:53:00 +00006414 QualType QPointeeTy = Context.getCVRQualifiedType(PointeeTy, CVR);
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006415
6416 // Build qualified pointer type.
6417 QualType QPointerTy;
Fariborz Jahanian957b4df2010-08-21 17:11:09 +00006418 if (!buildObjCPtr)
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006419 QPointerTy = Context.getPointerType(QPointeeTy);
Fariborz Jahanian957b4df2010-08-21 17:11:09 +00006420 else
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006421 QPointerTy = Context.getObjCObjectPointerType(QPointeeTy);
6422
6423 // Insert qualified pointer type.
6424 PointerTypes.insert(QPointerTy);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006425 }
6426
6427 return true;
6428}
6429
Sebastian Redl78eb8742009-04-19 21:53:20 +00006430/// AddMemberPointerWithMoreQualifiedTypeVariants - Add the pointer type @p Ty
6431/// to the set of pointer types along with any more-qualified variants of
6432/// that type. For example, if @p Ty is "int const *", this routine
6433/// will add "int const *", "int const volatile *", "int const
6434/// restrict *", and "int const volatile restrict *" to the set of
6435/// pointer types. Returns true if the add of @p Ty itself succeeded,
6436/// false otherwise.
John McCall0953e762009-09-24 19:53:00 +00006437///
6438/// FIXME: what to do about extended qualifiers?
Sebastian Redl78eb8742009-04-19 21:53:20 +00006439bool
6440BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
6441 QualType Ty) {
6442 // Insert this type.
6443 if (!MemberPointerTypes.insert(Ty))
6444 return false;
6445
John McCall0953e762009-09-24 19:53:00 +00006446 const MemberPointerType *PointerTy = Ty->getAs<MemberPointerType>();
6447 assert(PointerTy && "type was not a member pointer type!");
Sebastian Redl78eb8742009-04-19 21:53:20 +00006448
John McCall0953e762009-09-24 19:53:00 +00006449 QualType PointeeTy = PointerTy->getPointeeType();
Sebastian Redla9efada2009-11-18 20:39:26 +00006450 // Don't add qualified variants of arrays. For one, they're not allowed
6451 // (the qualifier would sink to the element type), and for another, the
6452 // only overload situation where it matters is subscript or pointer +- int,
6453 // and those shouldn't have qualifier variants anyway.
6454 if (PointeeTy->isArrayType())
6455 return true;
John McCall0953e762009-09-24 19:53:00 +00006456 const Type *ClassTy = PointerTy->getClass();
6457
6458 // Iterate through all strict supersets of the pointee type's CVR
6459 // qualifiers.
6460 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
6461 for (unsigned CVR = BaseCVR+1; CVR <= Qualifiers::CVRMask; ++CVR) {
6462 if ((CVR | BaseCVR) != CVR) continue;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006463
John McCall0953e762009-09-24 19:53:00 +00006464 QualType QPointeeTy = Context.getCVRQualifiedType(PointeeTy, CVR);
Chandler Carruth6df868e2010-12-12 08:17:55 +00006465 MemberPointerTypes.insert(
6466 Context.getMemberPointerType(QPointeeTy, ClassTy));
Sebastian Redl78eb8742009-04-19 21:53:20 +00006467 }
6468
6469 return true;
6470}
6471
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006472/// AddTypesConvertedFrom - Add each of the types to which the type @p
6473/// Ty can be implicit converted to the given set of @p Types. We're
Sebastian Redl78eb8742009-04-19 21:53:20 +00006474/// primarily interested in pointer types and enumeration types. We also
6475/// take member pointer types, for the conditional operator.
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006476/// AllowUserConversions is true if we should look at the conversion
6477/// functions of a class type, and AllowExplicitConversions if we
6478/// should also include the explicit conversion functions of a class
6479/// type.
Mike Stump1eb44332009-09-09 15:08:12 +00006480void
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006481BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
Douglas Gregor573d9c32009-10-21 23:19:44 +00006482 SourceLocation Loc,
Douglas Gregor09f41cf2009-01-14 15:45:31 +00006483 bool AllowUserConversions,
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006484 bool AllowExplicitConversions,
6485 const Qualifiers &VisibleQuals) {
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006486 // Only deal with canonical types.
6487 Ty = Context.getCanonicalType(Ty);
6488
6489 // Look through reference types; they aren't part of the type of an
6490 // expression for the purposes of conversions.
Ted Kremenek6217b802009-07-29 21:53:49 +00006491 if (const ReferenceType *RefTy = Ty->getAs<ReferenceType>())
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006492 Ty = RefTy->getPointeeType();
6493
John McCall3b657512011-01-19 10:06:00 +00006494 // If we're dealing with an array type, decay to the pointer.
6495 if (Ty->isArrayType())
6496 Ty = SemaRef.Context.getArrayDecayedType(Ty);
6497
6498 // Otherwise, we don't care about qualifiers on the type.
Douglas Gregora4923eb2009-11-16 21:35:15 +00006499 Ty = Ty.getLocalUnqualifiedType();
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006500
Chandler Carruth6a577462010-12-13 01:44:01 +00006501 // Flag if we ever add a non-record type.
6502 const RecordType *TyRec = Ty->getAs<RecordType>();
6503 HasNonRecordTypes = HasNonRecordTypes || !TyRec;
6504
Chandler Carruth6a577462010-12-13 01:44:01 +00006505 // Flag if we encounter an arithmetic type.
6506 HasArithmeticOrEnumeralTypes =
6507 HasArithmeticOrEnumeralTypes || Ty->isArithmeticType();
6508
Fariborz Jahanian2e2acec2010-08-21 00:10:36 +00006509 if (Ty->isObjCIdType() || Ty->isObjCClassType())
6510 PointerTypes.insert(Ty);
6511 else if (Ty->getAs<PointerType>() || Ty->getAs<ObjCObjectPointerType>()) {
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006512 // Insert our type, and its more-qualified variants, into the set
6513 // of types.
Fariborz Jahanian1cad6022009-10-16 22:08:05 +00006514 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006515 return;
Sebastian Redl78eb8742009-04-19 21:53:20 +00006516 } else if (Ty->isMemberPointerType()) {
6517 // Member pointers are far easier, since the pointee can't be converted.
6518 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
6519 return;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006520 } else if (Ty->isEnumeralType()) {
Chandler Carruth6a577462010-12-13 01:44:01 +00006521 HasArithmeticOrEnumeralTypes = true;
Chris Lattnere37b94c2009-03-29 00:04:01 +00006522 EnumerationTypes.insert(Ty);
Douglas Gregor26bcf672010-05-19 03:21:00 +00006523 } else if (Ty->isVectorType()) {
Chandler Carruth6a577462010-12-13 01:44:01 +00006524 // We treat vector types as arithmetic types in many contexts as an
6525 // extension.
6526 HasArithmeticOrEnumeralTypes = true;
Douglas Gregor26bcf672010-05-19 03:21:00 +00006527 VectorTypes.insert(Ty);
Douglas Gregor84ee2ee2011-05-21 23:15:46 +00006528 } else if (Ty->isNullPtrType()) {
6529 HasNullPtrType = true;
Chandler Carruth6a577462010-12-13 01:44:01 +00006530 } else if (AllowUserConversions && TyRec) {
6531 // No conversion functions in incomplete types.
6532 if (SemaRef.RequireCompleteType(Loc, Ty, 0))
6533 return;
Mike Stump1eb44332009-09-09 15:08:12 +00006534
Chandler Carruth6a577462010-12-13 01:44:01 +00006535 CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(TyRec->getDecl());
Argyrios Kyrtzidis9d295432012-11-28 03:56:09 +00006536 std::pair<CXXRecordDecl::conversion_iterator,
6537 CXXRecordDecl::conversion_iterator>
6538 Conversions = ClassDecl->getVisibleConversionFunctions();
6539 for (CXXRecordDecl::conversion_iterator
6540 I = Conversions.first, E = Conversions.second; I != E; ++I) {
Chandler Carruth6a577462010-12-13 01:44:01 +00006541 NamedDecl *D = I.getDecl();
6542 if (isa<UsingShadowDecl>(D))
6543 D = cast<UsingShadowDecl>(D)->getTargetDecl();
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006544
Chandler Carruth6a577462010-12-13 01:44:01 +00006545 // Skip conversion function templates; they don't tell us anything
6546 // about which builtin types we can convert to.
6547 if (isa<FunctionTemplateDecl>(D))
6548 continue;
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00006549
Chandler Carruth6a577462010-12-13 01:44:01 +00006550 CXXConversionDecl *Conv = cast<CXXConversionDecl>(D);
6551 if (AllowExplicitConversions || !Conv->isExplicit()) {
6552 AddTypesConvertedFrom(Conv->getConversionType(), Loc, false, false,
6553 VisibleQuals);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00006554 }
6555 }
6556 }
6557}
6558
Douglas Gregor19b7b152009-08-24 13:43:27 +00006559/// \brief Helper function for AddBuiltinOperatorCandidates() that adds
6560/// the volatile- and non-volatile-qualified assignment operators for the
6561/// given type to the candidate set.
6562static void AddBuiltinAssignmentOperatorCandidates(Sema &S,
6563 QualType T,
Richard Smith958ba642013-05-05 15:51:06 +00006564 ArrayRef<Expr *> Args,
Douglas Gregor19b7b152009-08-24 13:43:27 +00006565 OverloadCandidateSet &CandidateSet) {
6566 QualType ParamTypes[2];
Mike Stump1eb44332009-09-09 15:08:12 +00006567
Douglas Gregor19b7b152009-08-24 13:43:27 +00006568 // T& operator=(T&, T)
6569 ParamTypes[0] = S.Context.getLValueReferenceType(T);
6570 ParamTypes[1] = T;
Richard Smith958ba642013-05-05 15:51:06 +00006571 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Douglas Gregor19b7b152009-08-24 13:43:27 +00006572 /*IsAssignmentOperator=*/true);
Mike Stump1eb44332009-09-09 15:08:12 +00006573
Douglas Gregor19b7b152009-08-24 13:43:27 +00006574 if (!S.Context.getCanonicalType(T).isVolatileQualified()) {
6575 // volatile T& operator=(volatile T&, T)
John McCall0953e762009-09-24 19:53:00 +00006576 ParamTypes[0]
6577 = S.Context.getLValueReferenceType(S.Context.getVolatileType(T));
Douglas Gregor19b7b152009-08-24 13:43:27 +00006578 ParamTypes[1] = T;
Richard Smith958ba642013-05-05 15:51:06 +00006579 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Mike Stump1eb44332009-09-09 15:08:12 +00006580 /*IsAssignmentOperator=*/true);
Douglas Gregor19b7b152009-08-24 13:43:27 +00006581 }
6582}
Mike Stump1eb44332009-09-09 15:08:12 +00006583
Sebastian Redl9994a342009-10-25 17:03:50 +00006584/// CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers,
6585/// if any, found in visible type conversion functions found in ArgExpr's type.
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006586static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr* ArgExpr) {
6587 Qualifiers VRQuals;
6588 const RecordType *TyRec;
6589 if (const MemberPointerType *RHSMPType =
6590 ArgExpr->getType()->getAs<MemberPointerType>())
Douglas Gregorb86cf0c2010-04-25 00:55:24 +00006591 TyRec = RHSMPType->getClass()->getAs<RecordType>();
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006592 else
6593 TyRec = ArgExpr->getType()->getAs<RecordType>();
6594 if (!TyRec) {
Fariborz Jahanian1cad6022009-10-16 22:08:05 +00006595 // Just to be safe, assume the worst case.
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006596 VRQuals.addVolatile();
6597 VRQuals.addRestrict();
6598 return VRQuals;
6599 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006600
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006601 CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(TyRec->getDecl());
John McCall86ff3082010-02-04 22:26:26 +00006602 if (!ClassDecl->hasDefinition())
6603 return VRQuals;
6604
Argyrios Kyrtzidis9d295432012-11-28 03:56:09 +00006605 std::pair<CXXRecordDecl::conversion_iterator,
6606 CXXRecordDecl::conversion_iterator>
6607 Conversions = ClassDecl->getVisibleConversionFunctions();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006608
Argyrios Kyrtzidis9d295432012-11-28 03:56:09 +00006609 for (CXXRecordDecl::conversion_iterator
6610 I = Conversions.first, E = Conversions.second; I != E; ++I) {
John McCall32daa422010-03-31 01:36:47 +00006611 NamedDecl *D = I.getDecl();
6612 if (isa<UsingShadowDecl>(D))
6613 D = cast<UsingShadowDecl>(D)->getTargetDecl();
6614 if (CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(D)) {
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006615 QualType CanTy = Context.getCanonicalType(Conv->getConversionType());
6616 if (const ReferenceType *ResTypeRef = CanTy->getAs<ReferenceType>())
6617 CanTy = ResTypeRef->getPointeeType();
6618 // Need to go down the pointer/mempointer chain and add qualifiers
6619 // as see them.
6620 bool done = false;
6621 while (!done) {
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006622 if (CanTy.isRestrictQualified())
6623 VRQuals.addRestrict();
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006624 if (const PointerType *ResTypePtr = CanTy->getAs<PointerType>())
6625 CanTy = ResTypePtr->getPointeeType();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006626 else if (const MemberPointerType *ResTypeMPtr =
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006627 CanTy->getAs<MemberPointerType>())
6628 CanTy = ResTypeMPtr->getPointeeType();
6629 else
6630 done = true;
6631 if (CanTy.isVolatileQualified())
6632 VRQuals.addVolatile();
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00006633 if (VRQuals.hasRestrict() && VRQuals.hasVolatile())
6634 return VRQuals;
6635 }
6636 }
6637 }
6638 return VRQuals;
6639}
John McCall00071ec2010-11-13 05:51:15 +00006640
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006641namespace {
John McCall00071ec2010-11-13 05:51:15 +00006642
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006643/// \brief Helper class to manage the addition of builtin operator overload
6644/// candidates. It provides shared state and utility methods used throughout
6645/// the process, as well as a helper method to add each group of builtin
6646/// operator overloads from the standard to a candidate set.
6647class BuiltinOperatorOverloadBuilder {
Chandler Carruth6d695582010-12-12 10:35:00 +00006648 // Common instance state available to all overload candidate addition methods.
6649 Sema &S;
Richard Smith958ba642013-05-05 15:51:06 +00006650 ArrayRef<Expr *> Args;
Chandler Carruth6d695582010-12-12 10:35:00 +00006651 Qualifiers VisibleTypeConversionsQuals;
Chandler Carruth6a577462010-12-13 01:44:01 +00006652 bool HasArithmeticOrEnumeralCandidateType;
Chris Lattner5f9e2722011-07-23 10:55:15 +00006653 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
Chandler Carruth6d695582010-12-12 10:35:00 +00006654 OverloadCandidateSet &CandidateSet;
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006655
Chandler Carruth6d695582010-12-12 10:35:00 +00006656 // Define some constants used to index and iterate over the arithemetic types
6657 // provided via the getArithmeticType() method below.
John McCall00071ec2010-11-13 05:51:15 +00006658 // The "promoted arithmetic types" are the arithmetic
6659 // types are that preserved by promotion (C++ [over.built]p2).
John McCall00071ec2010-11-13 05:51:15 +00006660 static const unsigned FirstIntegralType = 3;
Richard Smith3c2fcf82012-06-10 08:00:26 +00006661 static const unsigned LastIntegralType = 20;
John McCall00071ec2010-11-13 05:51:15 +00006662 static const unsigned FirstPromotedIntegralType = 3,
Richard Smith3c2fcf82012-06-10 08:00:26 +00006663 LastPromotedIntegralType = 11;
John McCall00071ec2010-11-13 05:51:15 +00006664 static const unsigned FirstPromotedArithmeticType = 0,
Richard Smith3c2fcf82012-06-10 08:00:26 +00006665 LastPromotedArithmeticType = 11;
6666 static const unsigned NumArithmeticTypes = 20;
John McCall00071ec2010-11-13 05:51:15 +00006667
Chandler Carruth6d695582010-12-12 10:35:00 +00006668 /// \brief Get the canonical type for a given arithmetic type index.
6669 CanQualType getArithmeticType(unsigned index) {
6670 assert(index < NumArithmeticTypes);
6671 static CanQualType ASTContext::* const
6672 ArithmeticTypes[NumArithmeticTypes] = {
6673 // Start of promoted types.
6674 &ASTContext::FloatTy,
6675 &ASTContext::DoubleTy,
6676 &ASTContext::LongDoubleTy,
John McCall00071ec2010-11-13 05:51:15 +00006677
Chandler Carruth6d695582010-12-12 10:35:00 +00006678 // Start of integral types.
6679 &ASTContext::IntTy,
6680 &ASTContext::LongTy,
6681 &ASTContext::LongLongTy,
Richard Smith3c2fcf82012-06-10 08:00:26 +00006682 &ASTContext::Int128Ty,
Chandler Carruth6d695582010-12-12 10:35:00 +00006683 &ASTContext::UnsignedIntTy,
6684 &ASTContext::UnsignedLongTy,
6685 &ASTContext::UnsignedLongLongTy,
Richard Smith3c2fcf82012-06-10 08:00:26 +00006686 &ASTContext::UnsignedInt128Ty,
Chandler Carruth6d695582010-12-12 10:35:00 +00006687 // End of promoted types.
6688
6689 &ASTContext::BoolTy,
6690 &ASTContext::CharTy,
6691 &ASTContext::WCharTy,
6692 &ASTContext::Char16Ty,
6693 &ASTContext::Char32Ty,
6694 &ASTContext::SignedCharTy,
6695 &ASTContext::ShortTy,
6696 &ASTContext::UnsignedCharTy,
6697 &ASTContext::UnsignedShortTy,
6698 // End of integral types.
Richard Smith3c2fcf82012-06-10 08:00:26 +00006699 // FIXME: What about complex? What about half?
Chandler Carruth6d695582010-12-12 10:35:00 +00006700 };
6701 return S.Context.*ArithmeticTypes[index];
6702 }
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006703
Chandler Carruth38ca8d12010-12-12 09:59:53 +00006704 /// \brief Gets the canonical type resulting from the usual arithemetic
6705 /// converions for the given arithmetic types.
6706 CanQualType getUsualArithmeticConversions(unsigned L, unsigned R) {
6707 // Accelerator table for performing the usual arithmetic conversions.
6708 // The rules are basically:
6709 // - if either is floating-point, use the wider floating-point
6710 // - if same signedness, use the higher rank
6711 // - if same size, use unsigned of the higher rank
6712 // - use the larger type
6713 // These rules, together with the axiom that higher ranks are
6714 // never smaller, are sufficient to precompute all of these results
6715 // *except* when dealing with signed types of higher rank.
6716 // (we could precompute SLL x UI for all known platforms, but it's
6717 // better not to make any assumptions).
Richard Smith3c2fcf82012-06-10 08:00:26 +00006718 // We assume that int128 has a higher rank than long long on all platforms.
Chandler Carruth38ca8d12010-12-12 09:59:53 +00006719 enum PromotedType {
Richard Smith3c2fcf82012-06-10 08:00:26 +00006720 Dep=-1,
6721 Flt, Dbl, LDbl, SI, SL, SLL, S128, UI, UL, ULL, U128
Chandler Carruth38ca8d12010-12-12 09:59:53 +00006722 };
Nuno Lopes79e244f2012-04-21 14:45:25 +00006723 static const PromotedType ConversionsTable[LastPromotedArithmeticType]
Chandler Carruth38ca8d12010-12-12 09:59:53 +00006724 [LastPromotedArithmeticType] = {
Richard Smith3c2fcf82012-06-10 08:00:26 +00006725/* Flt*/ { Flt, Dbl, LDbl, Flt, Flt, Flt, Flt, Flt, Flt, Flt, Flt },
6726/* Dbl*/ { Dbl, Dbl, LDbl, Dbl, Dbl, Dbl, Dbl, Dbl, Dbl, Dbl, Dbl },
6727/*LDbl*/ { LDbl, LDbl, LDbl, LDbl, LDbl, LDbl, LDbl, LDbl, LDbl, LDbl, LDbl },
6728/* SI*/ { Flt, Dbl, LDbl, SI, SL, SLL, S128, UI, UL, ULL, U128 },
6729/* SL*/ { Flt, Dbl, LDbl, SL, SL, SLL, S128, Dep, UL, ULL, U128 },
6730/* SLL*/ { Flt, Dbl, LDbl, SLL, SLL, SLL, S128, Dep, Dep, ULL, U128 },
6731/*S128*/ { Flt, Dbl, LDbl, S128, S128, S128, S128, S128, S128, S128, U128 },
6732/* UI*/ { Flt, Dbl, LDbl, UI, Dep, Dep, S128, UI, UL, ULL, U128 },
6733/* UL*/ { Flt, Dbl, LDbl, UL, UL, Dep, S128, UL, UL, ULL, U128 },
6734/* ULL*/ { Flt, Dbl, LDbl, ULL, ULL, ULL, S128, ULL, ULL, ULL, U128 },
6735/*U128*/ { Flt, Dbl, LDbl, U128, U128, U128, U128, U128, U128, U128, U128 },
Chandler Carruth38ca8d12010-12-12 09:59:53 +00006736 };
6737
6738 assert(L < LastPromotedArithmeticType);
6739 assert(R < LastPromotedArithmeticType);
6740 int Idx = ConversionsTable[L][R];
6741
6742 // Fast path: the table gives us a concrete answer.
Chandler Carruth6d695582010-12-12 10:35:00 +00006743 if (Idx != Dep) return getArithmeticType(Idx);
Chandler Carruth38ca8d12010-12-12 09:59:53 +00006744
6745 // Slow path: we need to compare widths.
6746 // An invariant is that the signed type has higher rank.
Chandler Carruth6d695582010-12-12 10:35:00 +00006747 CanQualType LT = getArithmeticType(L),
6748 RT = getArithmeticType(R);
Chandler Carruth38ca8d12010-12-12 09:59:53 +00006749 unsigned LW = S.Context.getIntWidth(LT),
6750 RW = S.Context.getIntWidth(RT);
6751
6752 // If they're different widths, use the signed type.
6753 if (LW > RW) return LT;
6754 else if (LW < RW) return RT;
6755
6756 // Otherwise, use the unsigned type of the signed type's rank.
6757 if (L == SL || R == SL) return S.Context.UnsignedLongTy;
6758 assert(L == SLL || R == SLL);
6759 return S.Context.UnsignedLongLongTy;
6760 }
6761
Chandler Carruth3c69dc42010-12-12 09:22:45 +00006762 /// \brief Helper method to factor out the common pattern of adding overloads
6763 /// for '++' and '--' builtin operators.
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006764 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006765 bool HasVolatile,
6766 bool HasRestrict) {
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006767 QualType ParamTypes[2] = {
6768 S.Context.getLValueReferenceType(CandidateTy),
6769 S.Context.IntTy
6770 };
6771
6772 // Non-volatile version.
Richard Smith958ba642013-05-05 15:51:06 +00006773 if (Args.size() == 1)
6774 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006775 else
Richard Smith958ba642013-05-05 15:51:06 +00006776 S.AddBuiltinCandidate(CandidateTy, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006777
6778 // Use a heuristic to reduce number of builtin candidates in the set:
6779 // add volatile version only if there are conversions to a volatile type.
6780 if (HasVolatile) {
6781 ParamTypes[0] =
6782 S.Context.getLValueReferenceType(
6783 S.Context.getVolatileType(CandidateTy));
Richard Smith958ba642013-05-05 15:51:06 +00006784 if (Args.size() == 1)
6785 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006786 else
Richard Smith958ba642013-05-05 15:51:06 +00006787 S.AddBuiltinCandidate(CandidateTy, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006788 }
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006789
6790 // Add restrict version only if there are conversions to a restrict type
6791 // and our candidate type is a non-restrict-qualified pointer.
6792 if (HasRestrict && CandidateTy->isAnyPointerType() &&
6793 !CandidateTy.isRestrictQualified()) {
6794 ParamTypes[0]
6795 = S.Context.getLValueReferenceType(
6796 S.Context.getCVRQualifiedType(CandidateTy, Qualifiers::Restrict));
Richard Smith958ba642013-05-05 15:51:06 +00006797 if (Args.size() == 1)
6798 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet);
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006799 else
Richard Smith958ba642013-05-05 15:51:06 +00006800 S.AddBuiltinCandidate(CandidateTy, ParamTypes, Args, CandidateSet);
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006801
6802 if (HasVolatile) {
6803 ParamTypes[0]
6804 = S.Context.getLValueReferenceType(
6805 S.Context.getCVRQualifiedType(CandidateTy,
6806 (Qualifiers::Volatile |
6807 Qualifiers::Restrict)));
Richard Smith958ba642013-05-05 15:51:06 +00006808 if (Args.size() == 1)
6809 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet);
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006810 else
Richard Smith958ba642013-05-05 15:51:06 +00006811 S.AddBuiltinCandidate(CandidateTy, ParamTypes, Args, CandidateSet);
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006812 }
6813 }
6814
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006815 }
6816
6817public:
6818 BuiltinOperatorOverloadBuilder(
Richard Smith958ba642013-05-05 15:51:06 +00006819 Sema &S, ArrayRef<Expr *> Args,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006820 Qualifiers VisibleTypeConversionsQuals,
Chandler Carruth6a577462010-12-13 01:44:01 +00006821 bool HasArithmeticOrEnumeralCandidateType,
Chris Lattner5f9e2722011-07-23 10:55:15 +00006822 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006823 OverloadCandidateSet &CandidateSet)
Richard Smith958ba642013-05-05 15:51:06 +00006824 : S(S), Args(Args),
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006825 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
Chandler Carruth6a577462010-12-13 01:44:01 +00006826 HasArithmeticOrEnumeralCandidateType(
6827 HasArithmeticOrEnumeralCandidateType),
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006828 CandidateTypes(CandidateTypes),
6829 CandidateSet(CandidateSet) {
6830 // Validate some of our static helper constants in debug builds.
Chandler Carruth6d695582010-12-12 10:35:00 +00006831 assert(getArithmeticType(FirstPromotedIntegralType) == S.Context.IntTy &&
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006832 "Invalid first promoted integral type");
Chandler Carruth6d695582010-12-12 10:35:00 +00006833 assert(getArithmeticType(LastPromotedIntegralType - 1)
Richard Smith3c2fcf82012-06-10 08:00:26 +00006834 == S.Context.UnsignedInt128Ty &&
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006835 "Invalid last promoted integral type");
Chandler Carruth6d695582010-12-12 10:35:00 +00006836 assert(getArithmeticType(FirstPromotedArithmeticType)
6837 == S.Context.FloatTy &&
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006838 "Invalid first promoted arithmetic type");
Chandler Carruth6d695582010-12-12 10:35:00 +00006839 assert(getArithmeticType(LastPromotedArithmeticType - 1)
Richard Smith3c2fcf82012-06-10 08:00:26 +00006840 == S.Context.UnsignedInt128Ty &&
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006841 "Invalid last promoted arithmetic type");
6842 }
6843
6844 // C++ [over.built]p3:
6845 //
6846 // For every pair (T, VQ), where T is an arithmetic type, and VQ
6847 // is either volatile or empty, there exist candidate operator
6848 // functions of the form
6849 //
6850 // VQ T& operator++(VQ T&);
6851 // T operator++(VQ T&, int);
6852 //
6853 // C++ [over.built]p4:
6854 //
6855 // For every pair (T, VQ), where T is an arithmetic type other
6856 // than bool, and VQ is either volatile or empty, there exist
6857 // candidate operator functions of the form
6858 //
6859 // VQ T& operator--(VQ T&);
6860 // T operator--(VQ T&, int);
6861 void addPlusPlusMinusMinusArithmeticOverloads(OverloadedOperatorKind Op) {
Chandler Carruth6a577462010-12-13 01:44:01 +00006862 if (!HasArithmeticOrEnumeralCandidateType)
6863 return;
6864
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006865 for (unsigned Arith = (Op == OO_PlusPlus? 0 : 1);
6866 Arith < NumArithmeticTypes; ++Arith) {
6867 addPlusPlusMinusMinusStyleOverloads(
Chandler Carruth6d695582010-12-12 10:35:00 +00006868 getArithmeticType(Arith),
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006869 VisibleTypeConversionsQuals.hasVolatile(),
6870 VisibleTypeConversionsQuals.hasRestrict());
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006871 }
6872 }
6873
6874 // C++ [over.built]p5:
6875 //
6876 // For every pair (T, VQ), where T is a cv-qualified or
6877 // cv-unqualified object type, and VQ is either volatile or
6878 // empty, there exist candidate operator functions of the form
6879 //
6880 // T*VQ& operator++(T*VQ&);
6881 // T*VQ& operator--(T*VQ&);
6882 // T* operator++(T*VQ&, int);
6883 // T* operator--(T*VQ&, int);
6884 void addPlusPlusMinusMinusPointerOverloads() {
6885 for (BuiltinCandidateTypeSet::iterator
6886 Ptr = CandidateTypes[0].pointer_begin(),
6887 PtrEnd = CandidateTypes[0].pointer_end();
6888 Ptr != PtrEnd; ++Ptr) {
6889 // Skip pointer types that aren't pointers to object types.
Douglas Gregor2fdc5e82011-01-05 00:13:17 +00006890 if (!(*Ptr)->getPointeeType()->isObjectType())
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006891 continue;
6892
6893 addPlusPlusMinusMinusStyleOverloads(*Ptr,
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00006894 (!(*Ptr).isVolatileQualified() &&
6895 VisibleTypeConversionsQuals.hasVolatile()),
6896 (!(*Ptr).isRestrictQualified() &&
6897 VisibleTypeConversionsQuals.hasRestrict()));
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006898 }
6899 }
6900
6901 // C++ [over.built]p6:
6902 // For every cv-qualified or cv-unqualified object type T, there
6903 // exist candidate operator functions of the form
6904 //
6905 // T& operator*(T*);
6906 //
6907 // C++ [over.built]p7:
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006908 // For every function type T that does not have cv-qualifiers or a
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00006909 // ref-qualifier, there exist candidate operator functions of the form
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006910 // T& operator*(T*);
6911 void addUnaryStarPointerOverloads() {
6912 for (BuiltinCandidateTypeSet::iterator
6913 Ptr = CandidateTypes[0].pointer_begin(),
6914 PtrEnd = CandidateTypes[0].pointer_end();
6915 Ptr != PtrEnd; ++Ptr) {
6916 QualType ParamTy = *Ptr;
6917 QualType PointeeTy = ParamTy->getPointeeType();
Douglas Gregor2fdc5e82011-01-05 00:13:17 +00006918 if (!PointeeTy->isObjectType() && !PointeeTy->isFunctionType())
6919 continue;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006920
Douglas Gregor2c9a03f2011-01-26 19:30:28 +00006921 if (const FunctionProtoType *Proto =PointeeTy->getAs<FunctionProtoType>())
6922 if (Proto->getTypeQuals() || Proto->getRefQualifier())
6923 continue;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00006924
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006925 S.AddBuiltinCandidate(S.Context.getLValueReferenceType(PointeeTy),
Richard Smith958ba642013-05-05 15:51:06 +00006926 &ParamTy, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006927 }
6928 }
6929
6930 // C++ [over.built]p9:
6931 // For every promoted arithmetic type T, there exist candidate
6932 // operator functions of the form
6933 //
6934 // T operator+(T);
6935 // T operator-(T);
6936 void addUnaryPlusOrMinusArithmeticOverloads() {
Chandler Carruth6a577462010-12-13 01:44:01 +00006937 if (!HasArithmeticOrEnumeralCandidateType)
6938 return;
6939
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006940 for (unsigned Arith = FirstPromotedArithmeticType;
6941 Arith < LastPromotedArithmeticType; ++Arith) {
Chandler Carruth6d695582010-12-12 10:35:00 +00006942 QualType ArithTy = getArithmeticType(Arith);
Richard Smith958ba642013-05-05 15:51:06 +00006943 S.AddBuiltinCandidate(ArithTy, &ArithTy, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006944 }
6945
6946 // Extension: We also add these operators for vector types.
6947 for (BuiltinCandidateTypeSet::iterator
6948 Vec = CandidateTypes[0].vector_begin(),
6949 VecEnd = CandidateTypes[0].vector_end();
6950 Vec != VecEnd; ++Vec) {
6951 QualType VecTy = *Vec;
Richard Smith958ba642013-05-05 15:51:06 +00006952 S.AddBuiltinCandidate(VecTy, &VecTy, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006953 }
6954 }
6955
6956 // C++ [over.built]p8:
6957 // For every type T, there exist candidate operator functions of
6958 // the form
6959 //
6960 // T* operator+(T*);
6961 void addUnaryPlusPointerOverloads() {
6962 for (BuiltinCandidateTypeSet::iterator
6963 Ptr = CandidateTypes[0].pointer_begin(),
6964 PtrEnd = CandidateTypes[0].pointer_end();
6965 Ptr != PtrEnd; ++Ptr) {
6966 QualType ParamTy = *Ptr;
Richard Smith958ba642013-05-05 15:51:06 +00006967 S.AddBuiltinCandidate(ParamTy, &ParamTy, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006968 }
6969 }
6970
6971 // C++ [over.built]p10:
6972 // For every promoted integral type T, there exist candidate
6973 // operator functions of the form
6974 //
6975 // T operator~(T);
6976 void addUnaryTildePromotedIntegralOverloads() {
Chandler Carruth6a577462010-12-13 01:44:01 +00006977 if (!HasArithmeticOrEnumeralCandidateType)
6978 return;
6979
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006980 for (unsigned Int = FirstPromotedIntegralType;
6981 Int < LastPromotedIntegralType; ++Int) {
Chandler Carruth6d695582010-12-12 10:35:00 +00006982 QualType IntTy = getArithmeticType(Int);
Richard Smith958ba642013-05-05 15:51:06 +00006983 S.AddBuiltinCandidate(IntTy, &IntTy, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006984 }
6985
6986 // Extension: We also add this operator for vector types.
6987 for (BuiltinCandidateTypeSet::iterator
6988 Vec = CandidateTypes[0].vector_begin(),
6989 VecEnd = CandidateTypes[0].vector_end();
6990 Vec != VecEnd; ++Vec) {
6991 QualType VecTy = *Vec;
Richard Smith958ba642013-05-05 15:51:06 +00006992 S.AddBuiltinCandidate(VecTy, &VecTy, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00006993 }
6994 }
6995
6996 // C++ [over.match.oper]p16:
6997 // For every pointer to member type T, there exist candidate operator
6998 // functions of the form
6999 //
7000 // bool operator==(T,T);
7001 // bool operator!=(T,T);
7002 void addEqualEqualOrNotEqualMemberPointerOverloads() {
7003 /// Set of (canonical) types that we've already handled.
7004 llvm::SmallPtrSet<QualType, 8> AddedTypes;
7005
Richard Smith958ba642013-05-05 15:51:06 +00007006 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007007 for (BuiltinCandidateTypeSet::iterator
7008 MemPtr = CandidateTypes[ArgIdx].member_pointer_begin(),
7009 MemPtrEnd = CandidateTypes[ArgIdx].member_pointer_end();
7010 MemPtr != MemPtrEnd;
7011 ++MemPtr) {
7012 // Don't add the same builtin candidate twice.
7013 if (!AddedTypes.insert(S.Context.getCanonicalType(*MemPtr)))
7014 continue;
7015
7016 QualType ParamTypes[2] = { *MemPtr, *MemPtr };
Richard Smith958ba642013-05-05 15:51:06 +00007017 S.AddBuiltinCandidate(S.Context.BoolTy, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007018 }
7019 }
7020 }
7021
7022 // C++ [over.built]p15:
7023 //
Douglas Gregor84ee2ee2011-05-21 23:15:46 +00007024 // For every T, where T is an enumeration type, a pointer type, or
7025 // std::nullptr_t, there exist candidate operator functions of the form
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007026 //
7027 // bool operator<(T, T);
7028 // bool operator>(T, T);
7029 // bool operator<=(T, T);
7030 // bool operator>=(T, T);
7031 // bool operator==(T, T);
7032 // bool operator!=(T, T);
Chandler Carruth7b80b4b2010-12-12 09:14:11 +00007033 void addRelationalPointerOrEnumeralOverloads() {
Eli Friedman97c67392012-09-18 21:52:24 +00007034 // C++ [over.match.oper]p3:
7035 // [...]the built-in candidates include all of the candidate operator
7036 // functions defined in 13.6 that, compared to the given operator, [...]
7037 // do not have the same parameter-type-list as any non-template non-member
7038 // candidate.
Chandler Carruth7b80b4b2010-12-12 09:14:11 +00007039 //
Eli Friedman97c67392012-09-18 21:52:24 +00007040 // Note that in practice, this only affects enumeration types because there
7041 // aren't any built-in candidates of record type, and a user-defined operator
7042 // must have an operand of record or enumeration type. Also, the only other
7043 // overloaded operator with enumeration arguments, operator=,
Chandler Carruth7b80b4b2010-12-12 09:14:11 +00007044 // cannot be overloaded for enumeration types, so this is the only place
7045 // where we must suppress candidates like this.
7046 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
7047 UserDefinedBinaryOperators;
7048
Richard Smith958ba642013-05-05 15:51:06 +00007049 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
Chandler Carruth7b80b4b2010-12-12 09:14:11 +00007050 if (CandidateTypes[ArgIdx].enumeration_begin() !=
7051 CandidateTypes[ArgIdx].enumeration_end()) {
7052 for (OverloadCandidateSet::iterator C = CandidateSet.begin(),
7053 CEnd = CandidateSet.end();
7054 C != CEnd; ++C) {
7055 if (!C->Viable || !C->Function || C->Function->getNumParams() != 2)
7056 continue;
7057
Eli Friedman97c67392012-09-18 21:52:24 +00007058 if (C->Function->isFunctionTemplateSpecialization())
7059 continue;
7060
Chandler Carruth7b80b4b2010-12-12 09:14:11 +00007061 QualType FirstParamType =
7062 C->Function->getParamDecl(0)->getType().getUnqualifiedType();
7063 QualType SecondParamType =
7064 C->Function->getParamDecl(1)->getType().getUnqualifiedType();
7065
7066 // Skip if either parameter isn't of enumeral type.
7067 if (!FirstParamType->isEnumeralType() ||
7068 !SecondParamType->isEnumeralType())
7069 continue;
7070
7071 // Add this operator to the set of known user-defined operators.
7072 UserDefinedBinaryOperators.insert(
7073 std::make_pair(S.Context.getCanonicalType(FirstParamType),
7074 S.Context.getCanonicalType(SecondParamType)));
7075 }
7076 }
7077 }
7078
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007079 /// Set of (canonical) types that we've already handled.
7080 llvm::SmallPtrSet<QualType, 8> AddedTypes;
7081
Richard Smith958ba642013-05-05 15:51:06 +00007082 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007083 for (BuiltinCandidateTypeSet::iterator
7084 Ptr = CandidateTypes[ArgIdx].pointer_begin(),
7085 PtrEnd = CandidateTypes[ArgIdx].pointer_end();
7086 Ptr != PtrEnd; ++Ptr) {
7087 // Don't add the same builtin candidate twice.
7088 if (!AddedTypes.insert(S.Context.getCanonicalType(*Ptr)))
7089 continue;
7090
7091 QualType ParamTypes[2] = { *Ptr, *Ptr };
Richard Smith958ba642013-05-05 15:51:06 +00007092 S.AddBuiltinCandidate(S.Context.BoolTy, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007093 }
7094 for (BuiltinCandidateTypeSet::iterator
7095 Enum = CandidateTypes[ArgIdx].enumeration_begin(),
7096 EnumEnd = CandidateTypes[ArgIdx].enumeration_end();
7097 Enum != EnumEnd; ++Enum) {
7098 CanQualType CanonType = S.Context.getCanonicalType(*Enum);
7099
Chandler Carruth7b80b4b2010-12-12 09:14:11 +00007100 // Don't add the same builtin candidate twice, or if a user defined
7101 // candidate exists.
7102 if (!AddedTypes.insert(CanonType) ||
7103 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
7104 CanonType)))
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007105 continue;
7106
7107 QualType ParamTypes[2] = { *Enum, *Enum };
Richard Smith958ba642013-05-05 15:51:06 +00007108 S.AddBuiltinCandidate(S.Context.BoolTy, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007109 }
Douglas Gregor84ee2ee2011-05-21 23:15:46 +00007110
7111 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
7112 CanQualType NullPtrTy = S.Context.getCanonicalType(S.Context.NullPtrTy);
7113 if (AddedTypes.insert(NullPtrTy) &&
Richard Smith958ba642013-05-05 15:51:06 +00007114 !UserDefinedBinaryOperators.count(std::make_pair(NullPtrTy,
Douglas Gregor84ee2ee2011-05-21 23:15:46 +00007115 NullPtrTy))) {
7116 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
Richard Smith958ba642013-05-05 15:51:06 +00007117 S.AddBuiltinCandidate(S.Context.BoolTy, ParamTypes, Args,
Douglas Gregor84ee2ee2011-05-21 23:15:46 +00007118 CandidateSet);
7119 }
7120 }
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007121 }
7122 }
7123
7124 // C++ [over.built]p13:
7125 //
7126 // For every cv-qualified or cv-unqualified object type T
7127 // there exist candidate operator functions of the form
7128 //
7129 // T* operator+(T*, ptrdiff_t);
7130 // T& operator[](T*, ptrdiff_t); [BELOW]
7131 // T* operator-(T*, ptrdiff_t);
7132 // T* operator+(ptrdiff_t, T*);
7133 // T& operator[](ptrdiff_t, T*); [BELOW]
7134 //
7135 // C++ [over.built]p14:
7136 //
7137 // For every T, where T is a pointer to object type, there
7138 // exist candidate operator functions of the form
7139 //
7140 // ptrdiff_t operator-(T, T);
7141 void addBinaryPlusOrMinusPointerOverloads(OverloadedOperatorKind Op) {
7142 /// Set of (canonical) types that we've already handled.
7143 llvm::SmallPtrSet<QualType, 8> AddedTypes;
7144
7145 for (int Arg = 0; Arg < 2; ++Arg) {
7146 QualType AsymetricParamTypes[2] = {
7147 S.Context.getPointerDiffType(),
7148 S.Context.getPointerDiffType(),
7149 };
7150 for (BuiltinCandidateTypeSet::iterator
7151 Ptr = CandidateTypes[Arg].pointer_begin(),
7152 PtrEnd = CandidateTypes[Arg].pointer_end();
7153 Ptr != PtrEnd; ++Ptr) {
Douglas Gregor2fdc5e82011-01-05 00:13:17 +00007154 QualType PointeeTy = (*Ptr)->getPointeeType();
7155 if (!PointeeTy->isObjectType())
7156 continue;
7157
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007158 AsymetricParamTypes[Arg] = *Ptr;
7159 if (Arg == 0 || Op == OO_Plus) {
7160 // operator+(T*, ptrdiff_t) or operator-(T*, ptrdiff_t)
7161 // T* operator+(ptrdiff_t, T*);
Richard Smith958ba642013-05-05 15:51:06 +00007162 S.AddBuiltinCandidate(*Ptr, AsymetricParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007163 }
7164 if (Op == OO_Minus) {
7165 // ptrdiff_t operator-(T, T);
7166 if (!AddedTypes.insert(S.Context.getCanonicalType(*Ptr)))
7167 continue;
7168
7169 QualType ParamTypes[2] = { *Ptr, *Ptr };
7170 S.AddBuiltinCandidate(S.Context.getPointerDiffType(), ParamTypes,
Richard Smith958ba642013-05-05 15:51:06 +00007171 Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007172 }
7173 }
7174 }
7175 }
7176
7177 // C++ [over.built]p12:
7178 //
7179 // For every pair of promoted arithmetic types L and R, there
7180 // exist candidate operator functions of the form
7181 //
7182 // LR operator*(L, R);
7183 // LR operator/(L, R);
7184 // LR operator+(L, R);
7185 // LR operator-(L, R);
7186 // bool operator<(L, R);
7187 // bool operator>(L, R);
7188 // bool operator<=(L, R);
7189 // bool operator>=(L, R);
7190 // bool operator==(L, R);
7191 // bool operator!=(L, R);
7192 //
7193 // where LR is the result of the usual arithmetic conversions
7194 // between types L and R.
7195 //
7196 // C++ [over.built]p24:
7197 //
7198 // For every pair of promoted arithmetic types L and R, there exist
7199 // candidate operator functions of the form
7200 //
7201 // LR operator?(bool, L, R);
7202 //
7203 // where LR is the result of the usual arithmetic conversions
7204 // between types L and R.
7205 // Our candidates ignore the first parameter.
7206 void addGenericBinaryArithmeticOverloads(bool isComparison) {
Chandler Carruth6a577462010-12-13 01:44:01 +00007207 if (!HasArithmeticOrEnumeralCandidateType)
7208 return;
7209
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007210 for (unsigned Left = FirstPromotedArithmeticType;
7211 Left < LastPromotedArithmeticType; ++Left) {
7212 for (unsigned Right = FirstPromotedArithmeticType;
7213 Right < LastPromotedArithmeticType; ++Right) {
Chandler Carruth6d695582010-12-12 10:35:00 +00007214 QualType LandR[2] = { getArithmeticType(Left),
7215 getArithmeticType(Right) };
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007216 QualType Result =
7217 isComparison ? S.Context.BoolTy
Chandler Carruth38ca8d12010-12-12 09:59:53 +00007218 : getUsualArithmeticConversions(Left, Right);
Richard Smith958ba642013-05-05 15:51:06 +00007219 S.AddBuiltinCandidate(Result, LandR, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007220 }
7221 }
7222
7223 // Extension: Add the binary operators ==, !=, <, <=, >=, >, *, /, and the
7224 // conditional operator for vector types.
7225 for (BuiltinCandidateTypeSet::iterator
7226 Vec1 = CandidateTypes[0].vector_begin(),
7227 Vec1End = CandidateTypes[0].vector_end();
7228 Vec1 != Vec1End; ++Vec1) {
7229 for (BuiltinCandidateTypeSet::iterator
7230 Vec2 = CandidateTypes[1].vector_begin(),
7231 Vec2End = CandidateTypes[1].vector_end();
7232 Vec2 != Vec2End; ++Vec2) {
7233 QualType LandR[2] = { *Vec1, *Vec2 };
7234 QualType Result = S.Context.BoolTy;
7235 if (!isComparison) {
7236 if ((*Vec1)->isExtVectorType() || !(*Vec2)->isExtVectorType())
7237 Result = *Vec1;
7238 else
7239 Result = *Vec2;
7240 }
7241
Richard Smith958ba642013-05-05 15:51:06 +00007242 S.AddBuiltinCandidate(Result, LandR, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007243 }
7244 }
7245 }
7246
7247 // C++ [over.built]p17:
7248 //
7249 // For every pair of promoted integral types L and R, there
7250 // exist candidate operator functions of the form
7251 //
7252 // LR operator%(L, R);
7253 // LR operator&(L, R);
7254 // LR operator^(L, R);
7255 // LR operator|(L, R);
7256 // L operator<<(L, R);
7257 // L operator>>(L, R);
7258 //
7259 // where LR is the result of the usual arithmetic conversions
7260 // between types L and R.
7261 void addBinaryBitwiseArithmeticOverloads(OverloadedOperatorKind Op) {
Chandler Carruth6a577462010-12-13 01:44:01 +00007262 if (!HasArithmeticOrEnumeralCandidateType)
7263 return;
7264
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007265 for (unsigned Left = FirstPromotedIntegralType;
7266 Left < LastPromotedIntegralType; ++Left) {
7267 for (unsigned Right = FirstPromotedIntegralType;
7268 Right < LastPromotedIntegralType; ++Right) {
Chandler Carruth6d695582010-12-12 10:35:00 +00007269 QualType LandR[2] = { getArithmeticType(Left),
7270 getArithmeticType(Right) };
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007271 QualType Result = (Op == OO_LessLess || Op == OO_GreaterGreater)
7272 ? LandR[0]
Chandler Carruth38ca8d12010-12-12 09:59:53 +00007273 : getUsualArithmeticConversions(Left, Right);
Richard Smith958ba642013-05-05 15:51:06 +00007274 S.AddBuiltinCandidate(Result, LandR, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007275 }
7276 }
7277 }
7278
7279 // C++ [over.built]p20:
7280 //
7281 // For every pair (T, VQ), where T is an enumeration or
7282 // pointer to member type and VQ is either volatile or
7283 // empty, there exist candidate operator functions of the form
7284 //
7285 // VQ T& operator=(VQ T&, T);
7286 void addAssignmentMemberPointerOrEnumeralOverloads() {
7287 /// Set of (canonical) types that we've already handled.
7288 llvm::SmallPtrSet<QualType, 8> AddedTypes;
7289
7290 for (unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
7291 for (BuiltinCandidateTypeSet::iterator
7292 Enum = CandidateTypes[ArgIdx].enumeration_begin(),
7293 EnumEnd = CandidateTypes[ArgIdx].enumeration_end();
7294 Enum != EnumEnd; ++Enum) {
7295 if (!AddedTypes.insert(S.Context.getCanonicalType(*Enum)))
7296 continue;
7297
Richard Smith958ba642013-05-05 15:51:06 +00007298 AddBuiltinAssignmentOperatorCandidates(S, *Enum, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007299 }
7300
7301 for (BuiltinCandidateTypeSet::iterator
7302 MemPtr = CandidateTypes[ArgIdx].member_pointer_begin(),
7303 MemPtrEnd = CandidateTypes[ArgIdx].member_pointer_end();
7304 MemPtr != MemPtrEnd; ++MemPtr) {
7305 if (!AddedTypes.insert(S.Context.getCanonicalType(*MemPtr)))
7306 continue;
7307
Richard Smith958ba642013-05-05 15:51:06 +00007308 AddBuiltinAssignmentOperatorCandidates(S, *MemPtr, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007309 }
7310 }
7311 }
7312
7313 // C++ [over.built]p19:
7314 //
7315 // For every pair (T, VQ), where T is any type and VQ is either
7316 // volatile or empty, there exist candidate operator functions
7317 // of the form
7318 //
7319 // T*VQ& operator=(T*VQ&, T*);
7320 //
7321 // C++ [over.built]p21:
7322 //
7323 // For every pair (T, VQ), where T is a cv-qualified or
7324 // cv-unqualified object type and VQ is either volatile or
7325 // empty, there exist candidate operator functions of the form
7326 //
7327 // T*VQ& operator+=(T*VQ&, ptrdiff_t);
7328 // T*VQ& operator-=(T*VQ&, ptrdiff_t);
7329 void addAssignmentPointerOverloads(bool isEqualOp) {
7330 /// Set of (canonical) types that we've already handled.
7331 llvm::SmallPtrSet<QualType, 8> AddedTypes;
7332
7333 for (BuiltinCandidateTypeSet::iterator
7334 Ptr = CandidateTypes[0].pointer_begin(),
7335 PtrEnd = CandidateTypes[0].pointer_end();
7336 Ptr != PtrEnd; ++Ptr) {
7337 // If this is operator=, keep track of the builtin candidates we added.
7338 if (isEqualOp)
7339 AddedTypes.insert(S.Context.getCanonicalType(*Ptr));
Douglas Gregor2fdc5e82011-01-05 00:13:17 +00007340 else if (!(*Ptr)->getPointeeType()->isObjectType())
7341 continue;
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007342
7343 // non-volatile version
7344 QualType ParamTypes[2] = {
7345 S.Context.getLValueReferenceType(*Ptr),
7346 isEqualOp ? *Ptr : S.Context.getPointerDiffType(),
7347 };
Richard Smith958ba642013-05-05 15:51:06 +00007348 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007349 /*IsAssigmentOperator=*/ isEqualOp);
7350
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00007351 bool NeedVolatile = !(*Ptr).isVolatileQualified() &&
7352 VisibleTypeConversionsQuals.hasVolatile();
7353 if (NeedVolatile) {
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007354 // volatile version
7355 ParamTypes[0] =
7356 S.Context.getLValueReferenceType(S.Context.getVolatileType(*Ptr));
Richard Smith958ba642013-05-05 15:51:06 +00007357 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007358 /*IsAssigmentOperator=*/isEqualOp);
7359 }
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00007360
7361 if (!(*Ptr).isRestrictQualified() &&
7362 VisibleTypeConversionsQuals.hasRestrict()) {
7363 // restrict version
7364 ParamTypes[0]
7365 = S.Context.getLValueReferenceType(S.Context.getRestrictType(*Ptr));
Richard Smith958ba642013-05-05 15:51:06 +00007366 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00007367 /*IsAssigmentOperator=*/isEqualOp);
7368
7369 if (NeedVolatile) {
7370 // volatile restrict version
7371 ParamTypes[0]
7372 = S.Context.getLValueReferenceType(
7373 S.Context.getCVRQualifiedType(*Ptr,
7374 (Qualifiers::Volatile |
7375 Qualifiers::Restrict)));
Richard Smith958ba642013-05-05 15:51:06 +00007376 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00007377 /*IsAssigmentOperator=*/isEqualOp);
7378 }
7379 }
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007380 }
7381
7382 if (isEqualOp) {
7383 for (BuiltinCandidateTypeSet::iterator
7384 Ptr = CandidateTypes[1].pointer_begin(),
7385 PtrEnd = CandidateTypes[1].pointer_end();
7386 Ptr != PtrEnd; ++Ptr) {
7387 // Make sure we don't add the same candidate twice.
7388 if (!AddedTypes.insert(S.Context.getCanonicalType(*Ptr)))
7389 continue;
7390
Chandler Carruth6df868e2010-12-12 08:17:55 +00007391 QualType ParamTypes[2] = {
7392 S.Context.getLValueReferenceType(*Ptr),
7393 *Ptr,
7394 };
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007395
7396 // non-volatile version
Richard Smith958ba642013-05-05 15:51:06 +00007397 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007398 /*IsAssigmentOperator=*/true);
7399
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00007400 bool NeedVolatile = !(*Ptr).isVolatileQualified() &&
7401 VisibleTypeConversionsQuals.hasVolatile();
7402 if (NeedVolatile) {
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007403 // volatile version
7404 ParamTypes[0] =
7405 S.Context.getLValueReferenceType(S.Context.getVolatileType(*Ptr));
Richard Smith958ba642013-05-05 15:51:06 +00007406 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
7407 /*IsAssigmentOperator=*/true);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007408 }
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00007409
7410 if (!(*Ptr).isRestrictQualified() &&
7411 VisibleTypeConversionsQuals.hasRestrict()) {
7412 // restrict version
7413 ParamTypes[0]
7414 = S.Context.getLValueReferenceType(S.Context.getRestrictType(*Ptr));
Richard Smith958ba642013-05-05 15:51:06 +00007415 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
7416 /*IsAssigmentOperator=*/true);
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00007417
7418 if (NeedVolatile) {
7419 // volatile restrict version
7420 ParamTypes[0]
7421 = S.Context.getLValueReferenceType(
7422 S.Context.getCVRQualifiedType(*Ptr,
7423 (Qualifiers::Volatile |
7424 Qualifiers::Restrict)));
Richard Smith958ba642013-05-05 15:51:06 +00007425 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
7426 /*IsAssigmentOperator=*/true);
Douglas Gregorb1c6f5f2012-06-04 00:15:09 +00007427 }
7428 }
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007429 }
7430 }
7431 }
7432
7433 // C++ [over.built]p18:
7434 //
7435 // For every triple (L, VQ, R), where L is an arithmetic type,
7436 // VQ is either volatile or empty, and R is a promoted
7437 // arithmetic type, there exist candidate operator functions of
7438 // the form
7439 //
7440 // VQ L& operator=(VQ L&, R);
7441 // VQ L& operator*=(VQ L&, R);
7442 // VQ L& operator/=(VQ L&, R);
7443 // VQ L& operator+=(VQ L&, R);
7444 // VQ L& operator-=(VQ L&, R);
7445 void addAssignmentArithmeticOverloads(bool isEqualOp) {
Chandler Carruth6a577462010-12-13 01:44:01 +00007446 if (!HasArithmeticOrEnumeralCandidateType)
7447 return;
7448
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007449 for (unsigned Left = 0; Left < NumArithmeticTypes; ++Left) {
7450 for (unsigned Right = FirstPromotedArithmeticType;
7451 Right < LastPromotedArithmeticType; ++Right) {
7452 QualType ParamTypes[2];
Chandler Carruth6d695582010-12-12 10:35:00 +00007453 ParamTypes[1] = getArithmeticType(Right);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007454
7455 // Add this built-in operator as a candidate (VQ is empty).
7456 ParamTypes[0] =
Chandler Carruth6d695582010-12-12 10:35:00 +00007457 S.Context.getLValueReferenceType(getArithmeticType(Left));
Richard Smith958ba642013-05-05 15:51:06 +00007458 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007459 /*IsAssigmentOperator=*/isEqualOp);
7460
7461 // Add this built-in operator as a candidate (VQ is 'volatile').
7462 if (VisibleTypeConversionsQuals.hasVolatile()) {
7463 ParamTypes[0] =
Chandler Carruth6d695582010-12-12 10:35:00 +00007464 S.Context.getVolatileType(getArithmeticType(Left));
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007465 ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]);
Richard Smith958ba642013-05-05 15:51:06 +00007466 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007467 /*IsAssigmentOperator=*/isEqualOp);
7468 }
7469 }
7470 }
7471
7472 // Extension: Add the binary operators =, +=, -=, *=, /= for vector types.
7473 for (BuiltinCandidateTypeSet::iterator
7474 Vec1 = CandidateTypes[0].vector_begin(),
7475 Vec1End = CandidateTypes[0].vector_end();
7476 Vec1 != Vec1End; ++Vec1) {
7477 for (BuiltinCandidateTypeSet::iterator
7478 Vec2 = CandidateTypes[1].vector_begin(),
7479 Vec2End = CandidateTypes[1].vector_end();
7480 Vec2 != Vec2End; ++Vec2) {
7481 QualType ParamTypes[2];
7482 ParamTypes[1] = *Vec2;
7483 // Add this built-in operator as a candidate (VQ is empty).
7484 ParamTypes[0] = S.Context.getLValueReferenceType(*Vec1);
Richard Smith958ba642013-05-05 15:51:06 +00007485 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007486 /*IsAssigmentOperator=*/isEqualOp);
7487
7488 // Add this built-in operator as a candidate (VQ is 'volatile').
7489 if (VisibleTypeConversionsQuals.hasVolatile()) {
7490 ParamTypes[0] = S.Context.getVolatileType(*Vec1);
7491 ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]);
Richard Smith958ba642013-05-05 15:51:06 +00007492 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007493 /*IsAssigmentOperator=*/isEqualOp);
7494 }
7495 }
7496 }
7497 }
7498
7499 // C++ [over.built]p22:
7500 //
7501 // For every triple (L, VQ, R), where L is an integral type, VQ
7502 // is either volatile or empty, and R is a promoted integral
7503 // type, there exist candidate operator functions of the form
7504 //
7505 // VQ L& operator%=(VQ L&, R);
7506 // VQ L& operator<<=(VQ L&, R);
7507 // VQ L& operator>>=(VQ L&, R);
7508 // VQ L& operator&=(VQ L&, R);
7509 // VQ L& operator^=(VQ L&, R);
7510 // VQ L& operator|=(VQ L&, R);
7511 void addAssignmentIntegralOverloads() {
Chandler Carruth6a577462010-12-13 01:44:01 +00007512 if (!HasArithmeticOrEnumeralCandidateType)
7513 return;
7514
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007515 for (unsigned Left = FirstIntegralType; Left < LastIntegralType; ++Left) {
7516 for (unsigned Right = FirstPromotedIntegralType;
7517 Right < LastPromotedIntegralType; ++Right) {
7518 QualType ParamTypes[2];
Chandler Carruth6d695582010-12-12 10:35:00 +00007519 ParamTypes[1] = getArithmeticType(Right);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007520
7521 // Add this built-in operator as a candidate (VQ is empty).
7522 ParamTypes[0] =
Chandler Carruth6d695582010-12-12 10:35:00 +00007523 S.Context.getLValueReferenceType(getArithmeticType(Left));
Richard Smith958ba642013-05-05 15:51:06 +00007524 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007525 if (VisibleTypeConversionsQuals.hasVolatile()) {
7526 // Add this built-in operator as a candidate (VQ is 'volatile').
Chandler Carruth6d695582010-12-12 10:35:00 +00007527 ParamTypes[0] = getArithmeticType(Left);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007528 ParamTypes[0] = S.Context.getVolatileType(ParamTypes[0]);
7529 ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]);
Richard Smith958ba642013-05-05 15:51:06 +00007530 S.AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007531 }
7532 }
7533 }
7534 }
7535
7536 // C++ [over.operator]p23:
7537 //
7538 // There also exist candidate operator functions of the form
7539 //
7540 // bool operator!(bool);
7541 // bool operator&&(bool, bool);
7542 // bool operator||(bool, bool);
7543 void addExclaimOverload() {
7544 QualType ParamTy = S.Context.BoolTy;
Richard Smith958ba642013-05-05 15:51:06 +00007545 S.AddBuiltinCandidate(ParamTy, &ParamTy, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007546 /*IsAssignmentOperator=*/false,
7547 /*NumContextualBoolArguments=*/1);
7548 }
7549 void addAmpAmpOrPipePipeOverload() {
7550 QualType ParamTypes[2] = { S.Context.BoolTy, S.Context.BoolTy };
Richard Smith958ba642013-05-05 15:51:06 +00007551 S.AddBuiltinCandidate(S.Context.BoolTy, ParamTypes, Args, CandidateSet,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007552 /*IsAssignmentOperator=*/false,
7553 /*NumContextualBoolArguments=*/2);
7554 }
7555
7556 // C++ [over.built]p13:
7557 //
7558 // For every cv-qualified or cv-unqualified object type T there
7559 // exist candidate operator functions of the form
7560 //
7561 // T* operator+(T*, ptrdiff_t); [ABOVE]
7562 // T& operator[](T*, ptrdiff_t);
7563 // T* operator-(T*, ptrdiff_t); [ABOVE]
7564 // T* operator+(ptrdiff_t, T*); [ABOVE]
7565 // T& operator[](ptrdiff_t, T*);
7566 void addSubscriptOverloads() {
7567 for (BuiltinCandidateTypeSet::iterator
7568 Ptr = CandidateTypes[0].pointer_begin(),
7569 PtrEnd = CandidateTypes[0].pointer_end();
7570 Ptr != PtrEnd; ++Ptr) {
7571 QualType ParamTypes[2] = { *Ptr, S.Context.getPointerDiffType() };
7572 QualType PointeeType = (*Ptr)->getPointeeType();
Douglas Gregor2fdc5e82011-01-05 00:13:17 +00007573 if (!PointeeType->isObjectType())
7574 continue;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00007575
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007576 QualType ResultTy = S.Context.getLValueReferenceType(PointeeType);
7577
7578 // T& operator[](T*, ptrdiff_t)
Richard Smith958ba642013-05-05 15:51:06 +00007579 S.AddBuiltinCandidate(ResultTy, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007580 }
7581
7582 for (BuiltinCandidateTypeSet::iterator
7583 Ptr = CandidateTypes[1].pointer_begin(),
7584 PtrEnd = CandidateTypes[1].pointer_end();
7585 Ptr != PtrEnd; ++Ptr) {
7586 QualType ParamTypes[2] = { S.Context.getPointerDiffType(), *Ptr };
7587 QualType PointeeType = (*Ptr)->getPointeeType();
Douglas Gregor2fdc5e82011-01-05 00:13:17 +00007588 if (!PointeeType->isObjectType())
7589 continue;
7590
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007591 QualType ResultTy = S.Context.getLValueReferenceType(PointeeType);
7592
7593 // T& operator[](ptrdiff_t, T*)
Richard Smith958ba642013-05-05 15:51:06 +00007594 S.AddBuiltinCandidate(ResultTy, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007595 }
7596 }
7597
7598 // C++ [over.built]p11:
7599 // For every quintuple (C1, C2, T, CV1, CV2), where C2 is a class type,
7600 // C1 is the same type as C2 or is a derived class of C2, T is an object
7601 // type or a function type, and CV1 and CV2 are cv-qualifier-seqs,
7602 // there exist candidate operator functions of the form
7603 //
7604 // CV12 T& operator->*(CV1 C1*, CV2 T C2::*);
7605 //
7606 // where CV12 is the union of CV1 and CV2.
7607 void addArrowStarOverloads() {
7608 for (BuiltinCandidateTypeSet::iterator
7609 Ptr = CandidateTypes[0].pointer_begin(),
7610 PtrEnd = CandidateTypes[0].pointer_end();
7611 Ptr != PtrEnd; ++Ptr) {
7612 QualType C1Ty = (*Ptr);
7613 QualType C1;
7614 QualifierCollector Q1;
7615 C1 = QualType(Q1.strip(C1Ty->getPointeeType()), 0);
7616 if (!isa<RecordType>(C1))
7617 continue;
7618 // heuristic to reduce number of builtin candidates in the set.
7619 // Add volatile/restrict version only if there are conversions to a
7620 // volatile/restrict type.
7621 if (!VisibleTypeConversionsQuals.hasVolatile() && Q1.hasVolatile())
7622 continue;
7623 if (!VisibleTypeConversionsQuals.hasRestrict() && Q1.hasRestrict())
7624 continue;
7625 for (BuiltinCandidateTypeSet::iterator
7626 MemPtr = CandidateTypes[1].member_pointer_begin(),
7627 MemPtrEnd = CandidateTypes[1].member_pointer_end();
7628 MemPtr != MemPtrEnd; ++MemPtr) {
7629 const MemberPointerType *mptr = cast<MemberPointerType>(*MemPtr);
7630 QualType C2 = QualType(mptr->getClass(), 0);
7631 C2 = C2.getUnqualifiedType();
7632 if (C1 != C2 && !S.IsDerivedFrom(C1, C2))
7633 break;
7634 QualType ParamTypes[2] = { *Ptr, *MemPtr };
7635 // build CV12 T&
7636 QualType T = mptr->getPointeeType();
7637 if (!VisibleTypeConversionsQuals.hasVolatile() &&
7638 T.isVolatileQualified())
7639 continue;
7640 if (!VisibleTypeConversionsQuals.hasRestrict() &&
7641 T.isRestrictQualified())
7642 continue;
7643 T = Q1.apply(S.Context, T);
7644 QualType ResultTy = S.Context.getLValueReferenceType(T);
Richard Smith958ba642013-05-05 15:51:06 +00007645 S.AddBuiltinCandidate(ResultTy, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007646 }
7647 }
7648 }
7649
7650 // Note that we don't consider the first argument, since it has been
7651 // contextually converted to bool long ago. The candidates below are
7652 // therefore added as binary.
7653 //
7654 // C++ [over.built]p25:
7655 // For every type T, where T is a pointer, pointer-to-member, or scoped
7656 // enumeration type, there exist candidate operator functions of the form
7657 //
7658 // T operator?(bool, T, T);
7659 //
7660 void addConditionalOperatorOverloads() {
7661 /// Set of (canonical) types that we've already handled.
7662 llvm::SmallPtrSet<QualType, 8> AddedTypes;
7663
7664 for (unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
7665 for (BuiltinCandidateTypeSet::iterator
7666 Ptr = CandidateTypes[ArgIdx].pointer_begin(),
7667 PtrEnd = CandidateTypes[ArgIdx].pointer_end();
7668 Ptr != PtrEnd; ++Ptr) {
7669 if (!AddedTypes.insert(S.Context.getCanonicalType(*Ptr)))
7670 continue;
7671
7672 QualType ParamTypes[2] = { *Ptr, *Ptr };
Richard Smith958ba642013-05-05 15:51:06 +00007673 S.AddBuiltinCandidate(*Ptr, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007674 }
7675
7676 for (BuiltinCandidateTypeSet::iterator
7677 MemPtr = CandidateTypes[ArgIdx].member_pointer_begin(),
7678 MemPtrEnd = CandidateTypes[ArgIdx].member_pointer_end();
7679 MemPtr != MemPtrEnd; ++MemPtr) {
7680 if (!AddedTypes.insert(S.Context.getCanonicalType(*MemPtr)))
7681 continue;
7682
7683 QualType ParamTypes[2] = { *MemPtr, *MemPtr };
Richard Smith958ba642013-05-05 15:51:06 +00007684 S.AddBuiltinCandidate(*MemPtr, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007685 }
7686
Richard Smith80ad52f2013-01-02 11:42:31 +00007687 if (S.getLangOpts().CPlusPlus11) {
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007688 for (BuiltinCandidateTypeSet::iterator
7689 Enum = CandidateTypes[ArgIdx].enumeration_begin(),
7690 EnumEnd = CandidateTypes[ArgIdx].enumeration_end();
7691 Enum != EnumEnd; ++Enum) {
7692 if (!(*Enum)->getAs<EnumType>()->getDecl()->isScoped())
7693 continue;
7694
7695 if (!AddedTypes.insert(S.Context.getCanonicalType(*Enum)))
7696 continue;
7697
7698 QualType ParamTypes[2] = { *Enum, *Enum };
Richard Smith958ba642013-05-05 15:51:06 +00007699 S.AddBuiltinCandidate(*Enum, ParamTypes, Args, CandidateSet);
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007700 }
7701 }
7702 }
7703 }
7704};
7705
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007706} // end anonymous namespace
7707
7708/// AddBuiltinOperatorCandidates - Add the appropriate built-in
7709/// operator overloads to the candidate set (C++ [over.built]), based
7710/// on the operator @p Op and the arguments given. For example, if the
7711/// operator is a binary '+', this routine might add "int
7712/// operator+(int, int)" to cover integer addition.
7713void
7714Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
7715 SourceLocation OpLoc,
Richard Smith958ba642013-05-05 15:51:06 +00007716 llvm::ArrayRef<Expr *> Args,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007717 OverloadCandidateSet& CandidateSet) {
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007718 // Find all of the types that the arguments can convert to, but only
7719 // if the operator we're looking at has built-in operator candidates
Chandler Carruth6a577462010-12-13 01:44:01 +00007720 // that make use of these types. Also record whether we encounter non-record
7721 // candidate types or either arithmetic or enumeral candidate types.
Fariborz Jahaniana9cca892009-10-15 17:14:05 +00007722 Qualifiers VisibleTypeConversionsQuals;
7723 VisibleTypeConversionsQuals.addConst();
Richard Smith958ba642013-05-05 15:51:06 +00007724 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx)
Fariborz Jahanian8621d012009-10-19 21:30:45 +00007725 VisibleTypeConversionsQuals += CollectVRQualifiers(Context, Args[ArgIdx]);
Chandler Carruth6a577462010-12-13 01:44:01 +00007726
7727 bool HasNonRecordCandidateType = false;
7728 bool HasArithmeticOrEnumeralCandidateType = false;
Chris Lattner5f9e2722011-07-23 10:55:15 +00007729 SmallVector<BuiltinCandidateTypeSet, 2> CandidateTypes;
Richard Smith958ba642013-05-05 15:51:06 +00007730 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
Douglas Gregorfec56e72010-11-03 17:00:07 +00007731 CandidateTypes.push_back(BuiltinCandidateTypeSet(*this));
7732 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->getType(),
7733 OpLoc,
7734 true,
7735 (Op == OO_Exclaim ||
7736 Op == OO_AmpAmp ||
7737 Op == OO_PipePipe),
7738 VisibleTypeConversionsQuals);
Chandler Carruth6a577462010-12-13 01:44:01 +00007739 HasNonRecordCandidateType = HasNonRecordCandidateType ||
7740 CandidateTypes[ArgIdx].hasNonRecordTypes();
7741 HasArithmeticOrEnumeralCandidateType =
7742 HasArithmeticOrEnumeralCandidateType ||
7743 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
Douglas Gregorfec56e72010-11-03 17:00:07 +00007744 }
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007745
Chandler Carruth6a577462010-12-13 01:44:01 +00007746 // Exit early when no non-record types have been added to the candidate set
7747 // for any of the arguments to the operator.
Douglas Gregor25aaff92011-10-10 14:05:31 +00007748 //
7749 // We can't exit early for !, ||, or &&, since there we have always have
7750 // 'bool' overloads.
Richard Smith958ba642013-05-05 15:51:06 +00007751 if (!HasNonRecordCandidateType &&
Douglas Gregor25aaff92011-10-10 14:05:31 +00007752 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
Chandler Carruth6a577462010-12-13 01:44:01 +00007753 return;
7754
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007755 // Setup an object to manage the common state for building overloads.
Richard Smith958ba642013-05-05 15:51:06 +00007756 BuiltinOperatorOverloadBuilder OpBuilder(*this, Args,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007757 VisibleTypeConversionsQuals,
Chandler Carruth6a577462010-12-13 01:44:01 +00007758 HasArithmeticOrEnumeralCandidateType,
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007759 CandidateTypes, CandidateSet);
7760
7761 // Dispatch over the operation to add in only those overloads which apply.
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007762 switch (Op) {
7763 case OO_None:
7764 case NUM_OVERLOADED_OPERATORS:
David Blaikieb219cfc2011-09-23 05:06:16 +00007765 llvm_unreachable("Expected an overloaded operator");
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007766
Chandler Carruthabb71842010-12-12 08:51:33 +00007767 case OO_New:
7768 case OO_Delete:
7769 case OO_Array_New:
7770 case OO_Array_Delete:
7771 case OO_Call:
David Blaikieb219cfc2011-09-23 05:06:16 +00007772 llvm_unreachable(
7773 "Special operators don't use AddBuiltinOperatorCandidates");
Chandler Carruthabb71842010-12-12 08:51:33 +00007774
7775 case OO_Comma:
7776 case OO_Arrow:
7777 // C++ [over.match.oper]p3:
7778 // -- For the operator ',', the unary operator '&', or the
7779 // operator '->', the built-in candidates set is empty.
Douglas Gregor74253732008-11-19 15:42:04 +00007780 break;
7781
7782 case OO_Plus: // '+' is either unary or binary
Richard Smith958ba642013-05-05 15:51:06 +00007783 if (Args.size() == 1)
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007784 OpBuilder.addUnaryPlusPointerOverloads();
Chandler Carruth32fe0d02010-12-12 08:41:34 +00007785 // Fall through.
Douglas Gregor74253732008-11-19 15:42:04 +00007786
7787 case OO_Minus: // '-' is either unary or binary
Richard Smith958ba642013-05-05 15:51:06 +00007788 if (Args.size() == 1) {
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007789 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
Chandler Carruthfe622742010-12-12 08:39:38 +00007790 } else {
7791 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
7792 OpBuilder.addGenericBinaryArithmeticOverloads(/*isComparison=*/false);
7793 }
Douglas Gregor74253732008-11-19 15:42:04 +00007794 break;
7795
Chandler Carruthabb71842010-12-12 08:51:33 +00007796 case OO_Star: // '*' is either unary or binary
Richard Smith958ba642013-05-05 15:51:06 +00007797 if (Args.size() == 1)
Chandler Carruthabb71842010-12-12 08:51:33 +00007798 OpBuilder.addUnaryStarPointerOverloads();
7799 else
7800 OpBuilder.addGenericBinaryArithmeticOverloads(/*isComparison=*/false);
7801 break;
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007802
Chandler Carruthabb71842010-12-12 08:51:33 +00007803 case OO_Slash:
7804 OpBuilder.addGenericBinaryArithmeticOverloads(/*isComparison=*/false);
Chandler Carruthc1409462010-12-12 08:45:02 +00007805 break;
Douglas Gregor74253732008-11-19 15:42:04 +00007806
7807 case OO_PlusPlus:
7808 case OO_MinusMinus:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007809 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
7810 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
Douglas Gregor74253732008-11-19 15:42:04 +00007811 break;
7812
Douglas Gregor19b7b152009-08-24 13:43:27 +00007813 case OO_EqualEqual:
7814 case OO_ExclaimEqual:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007815 OpBuilder.addEqualEqualOrNotEqualMemberPointerOverloads();
Chandler Carruthdaf55d32010-12-12 08:32:28 +00007816 // Fall through.
Chandler Carruthc1409462010-12-12 08:45:02 +00007817
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007818 case OO_Less:
7819 case OO_Greater:
7820 case OO_LessEqual:
7821 case OO_GreaterEqual:
Chandler Carruth7b80b4b2010-12-12 09:14:11 +00007822 OpBuilder.addRelationalPointerOrEnumeralOverloads();
Chandler Carruthdaf55d32010-12-12 08:32:28 +00007823 OpBuilder.addGenericBinaryArithmeticOverloads(/*isComparison=*/true);
7824 break;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007825
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007826 case OO_Percent:
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007827 case OO_Caret:
7828 case OO_Pipe:
7829 case OO_LessLess:
7830 case OO_GreaterGreater:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007831 OpBuilder.addBinaryBitwiseArithmeticOverloads(Op);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007832 break;
7833
Chandler Carruthabb71842010-12-12 08:51:33 +00007834 case OO_Amp: // '&' is either unary or binary
Richard Smith958ba642013-05-05 15:51:06 +00007835 if (Args.size() == 1)
Chandler Carruthabb71842010-12-12 08:51:33 +00007836 // C++ [over.match.oper]p3:
7837 // -- For the operator ',', the unary operator '&', or the
7838 // operator '->', the built-in candidates set is empty.
7839 break;
7840
7841 OpBuilder.addBinaryBitwiseArithmeticOverloads(Op);
7842 break;
7843
7844 case OO_Tilde:
7845 OpBuilder.addUnaryTildePromotedIntegralOverloads();
7846 break;
7847
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007848 case OO_Equal:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007849 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
Douglas Gregor26bcf672010-05-19 03:21:00 +00007850 // Fall through.
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007851
7852 case OO_PlusEqual:
7853 case OO_MinusEqual:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007854 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007855 // Fall through.
7856
7857 case OO_StarEqual:
7858 case OO_SlashEqual:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007859 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007860 break;
7861
7862 case OO_PercentEqual:
7863 case OO_LessLessEqual:
7864 case OO_GreaterGreaterEqual:
7865 case OO_AmpEqual:
7866 case OO_CaretEqual:
7867 case OO_PipeEqual:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007868 OpBuilder.addAssignmentIntegralOverloads();
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007869 break;
7870
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007871 case OO_Exclaim:
7872 OpBuilder.addExclaimOverload();
Douglas Gregor74253732008-11-19 15:42:04 +00007873 break;
Douglas Gregor74253732008-11-19 15:42:04 +00007874
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007875 case OO_AmpAmp:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007876 case OO_PipePipe:
7877 OpBuilder.addAmpAmpOrPipePipeOverload();
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007878 break;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007879
7880 case OO_Subscript:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007881 OpBuilder.addSubscriptOverloads();
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007882 break;
7883
7884 case OO_ArrowStar:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007885 OpBuilder.addArrowStarOverloads();
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007886 break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +00007887
7888 case OO_Conditional:
Chandler Carruth3a0f3ef2010-12-12 08:11:30 +00007889 OpBuilder.addConditionalOperatorOverloads();
Chandler Carruthfe622742010-12-12 08:39:38 +00007890 OpBuilder.addGenericBinaryArithmeticOverloads(/*isComparison=*/false);
7891 break;
Douglas Gregoreb8f3062008-11-12 17:17:38 +00007892 }
7893}
7894
Douglas Gregorfa047642009-02-04 00:32:51 +00007895/// \brief Add function candidates found via argument-dependent lookup
7896/// to the set of overloading candidates.
7897///
7898/// This routine performs argument-dependent name lookup based on the
7899/// given function name (which may also be an operator name) and adds
7900/// all of the overload candidates found by ADL to the overload
7901/// candidate set (C++ [basic.lookup.argdep]).
Mike Stump1eb44332009-09-09 15:08:12 +00007902void
Douglas Gregorfa047642009-02-04 00:32:51 +00007903Sema::AddArgumentDependentLookupCandidates(DeclarationName Name,
Richard Smithf5cd5cc2012-02-25 06:24:24 +00007904 bool Operator, SourceLocation Loc,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00007905 ArrayRef<Expr *> Args,
Douglas Gregor67714232011-03-03 02:41:12 +00007906 TemplateArgumentListInfo *ExplicitTemplateArgs,
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00007907 OverloadCandidateSet& CandidateSet,
Richard Smithb1502bc2012-10-18 17:56:02 +00007908 bool PartialOverloading) {
John McCall7edb5fd2010-01-26 07:16:45 +00007909 ADLResult Fns;
Douglas Gregorfa047642009-02-04 00:32:51 +00007910
John McCalla113e722010-01-26 06:04:06 +00007911 // FIXME: This approach for uniquing ADL results (and removing
7912 // redundant candidates from the set) relies on pointer-equality,
7913 // which means we need to key off the canonical decl. However,
7914 // always going back to the canonical decl might not get us the
7915 // right set of default arguments. What default arguments are
7916 // we supposed to consider on ADL candidates, anyway?
7917
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00007918 // FIXME: Pass in the explicit template arguments?
Richard Smithb1502bc2012-10-18 17:56:02 +00007919 ArgumentDependentLookup(Name, Operator, Loc, Args, Fns);
Douglas Gregorfa047642009-02-04 00:32:51 +00007920
Douglas Gregor3fd95ce2009-03-13 00:33:25 +00007921 // Erase all of the candidates we already knew about.
Douglas Gregor3fd95ce2009-03-13 00:33:25 +00007922 for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(),
7923 CandEnd = CandidateSet.end();
7924 Cand != CandEnd; ++Cand)
Douglas Gregor364e0212009-06-27 21:05:07 +00007925 if (Cand->Function) {
John McCall7edb5fd2010-01-26 07:16:45 +00007926 Fns.erase(Cand->Function);
Douglas Gregor364e0212009-06-27 21:05:07 +00007927 if (FunctionTemplateDecl *FunTmpl = Cand->Function->getPrimaryTemplate())
John McCall7edb5fd2010-01-26 07:16:45 +00007928 Fns.erase(FunTmpl);
Douglas Gregor364e0212009-06-27 21:05:07 +00007929 }
Douglas Gregor3fd95ce2009-03-13 00:33:25 +00007930
7931 // For each of the ADL candidates we found, add it to the overload
7932 // set.
John McCall7edb5fd2010-01-26 07:16:45 +00007933 for (ADLResult::iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) {
John McCall9aa472c2010-03-19 07:35:19 +00007934 DeclAccessPair FoundDecl = DeclAccessPair::make(*I, AS_none);
John McCall6e266892010-01-26 03:27:55 +00007935 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
John McCalld5532b62009-11-23 01:53:49 +00007936 if (ExplicitTemplateArgs)
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00007937 continue;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00007938
Ahmed Charles13a140c2012-02-25 11:00:22 +00007939 AddOverloadCandidate(FD, FoundDecl, Args, CandidateSet, false,
7940 PartialOverloading);
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00007941 } else
John McCall6e266892010-01-26 03:27:55 +00007942 AddTemplateOverloadCandidate(cast<FunctionTemplateDecl>(*I),
John McCall9aa472c2010-03-19 07:35:19 +00007943 FoundDecl, ExplicitTemplateArgs,
Ahmed Charles13a140c2012-02-25 11:00:22 +00007944 Args, CandidateSet);
Douglas Gregor364e0212009-06-27 21:05:07 +00007945 }
Douglas Gregorfa047642009-02-04 00:32:51 +00007946}
7947
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00007948/// isBetterOverloadCandidate - Determines whether the first overload
7949/// candidate is a better candidate than the second (C++ 13.3.3p1).
Mike Stump1eb44332009-09-09 15:08:12 +00007950bool
John McCall120d63c2010-08-24 20:38:10 +00007951isBetterOverloadCandidate(Sema &S,
Nick Lewycky7663f392010-11-20 01:29:55 +00007952 const OverloadCandidate &Cand1,
7953 const OverloadCandidate &Cand2,
Douglas Gregor8fcc5162010-09-12 08:07:23 +00007954 SourceLocation Loc,
7955 bool UserDefinedConversion) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00007956 // Define viable functions to be better candidates than non-viable
7957 // functions.
7958 if (!Cand2.Viable)
7959 return Cand1.Viable;
7960 else if (!Cand1.Viable)
7961 return false;
7962
Douglas Gregor88a35142008-12-22 05:46:06 +00007963 // C++ [over.match.best]p1:
7964 //
7965 // -- if F is a static member function, ICS1(F) is defined such
7966 // that ICS1(F) is neither better nor worse than ICS1(G) for
7967 // any function G, and, symmetrically, ICS1(G) is neither
7968 // better nor worse than ICS1(F).
7969 unsigned StartArg = 0;
7970 if (Cand1.IgnoreObjectArgument || Cand2.IgnoreObjectArgument)
7971 StartArg = 1;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00007972
Douglas Gregor3e15cc32009-07-07 23:38:56 +00007973 // C++ [over.match.best]p1:
Mike Stump1eb44332009-09-09 15:08:12 +00007974 // A viable function F1 is defined to be a better function than another
7975 // viable function F2 if for all arguments i, ICSi(F1) is not a worse
Douglas Gregor3e15cc32009-07-07 23:38:56 +00007976 // conversion sequence than ICSi(F2), and then...
Benjamin Kramer09dd3792012-01-14 16:32:05 +00007977 unsigned NumArgs = Cand1.NumConversions;
7978 assert(Cand2.NumConversions == NumArgs && "Overload candidate mismatch");
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00007979 bool HasBetterConversion = false;
Douglas Gregor88a35142008-12-22 05:46:06 +00007980 for (unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
John McCall120d63c2010-08-24 20:38:10 +00007981 switch (CompareImplicitConversionSequences(S,
7982 Cand1.Conversions[ArgIdx],
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00007983 Cand2.Conversions[ArgIdx])) {
7984 case ImplicitConversionSequence::Better:
7985 // Cand1 has a better conversion sequence.
7986 HasBetterConversion = true;
7987 break;
7988
7989 case ImplicitConversionSequence::Worse:
7990 // Cand1 can't be better than Cand2.
7991 return false;
7992
7993 case ImplicitConversionSequence::Indistinguishable:
7994 // Do nothing.
7995 break;
7996 }
7997 }
7998
Mike Stump1eb44332009-09-09 15:08:12 +00007999 // -- for some argument j, ICSj(F1) is a better conversion sequence than
Douglas Gregor3e15cc32009-07-07 23:38:56 +00008000 // ICSj(F2), or, if not that,
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008001 if (HasBetterConversion)
8002 return true;
8003
Mike Stump1eb44332009-09-09 15:08:12 +00008004 // - F1 is a non-template function and F2 is a function template
Douglas Gregor3e15cc32009-07-07 23:38:56 +00008005 // specialization, or, if not that,
Douglas Gregorccd47132010-06-08 21:03:17 +00008006 if ((!Cand1.Function || !Cand1.Function->getPrimaryTemplate()) &&
Douglas Gregor3e15cc32009-07-07 23:38:56 +00008007 Cand2.Function && Cand2.Function->getPrimaryTemplate())
8008 return true;
Mike Stump1eb44332009-09-09 15:08:12 +00008009
8010 // -- F1 and F2 are function template specializations, and the function
8011 // template for F1 is more specialized than the template for F2
8012 // according to the partial ordering rules described in 14.5.5.2, or,
Douglas Gregor3e15cc32009-07-07 23:38:56 +00008013 // if not that,
Douglas Gregor1f561c12009-08-02 23:46:29 +00008014 if (Cand1.Function && Cand1.Function->getPrimaryTemplate() &&
Douglas Gregordfc331e2011-01-19 23:54:39 +00008015 Cand2.Function && Cand2.Function->getPrimaryTemplate()) {
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00008016 if (FunctionTemplateDecl *BetterTemplate
John McCall120d63c2010-08-24 20:38:10 +00008017 = S.getMoreSpecializedTemplate(Cand1.Function->getPrimaryTemplate(),
8018 Cand2.Function->getPrimaryTemplate(),
8019 Loc,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008020 isa<CXXConversionDecl>(Cand1.Function)? TPOC_Conversion
Douglas Gregor5c7bf422011-01-11 17:34:58 +00008021 : TPOC_Call,
Douglas Gregordfc331e2011-01-19 23:54:39 +00008022 Cand1.ExplicitCallArguments))
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00008023 return BetterTemplate == Cand1.Function->getPrimaryTemplate();
Douglas Gregordfc331e2011-01-19 23:54:39 +00008024 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008025
Douglas Gregorf1991ea2008-11-07 22:36:19 +00008026 // -- the context is an initialization by user-defined conversion
8027 // (see 8.5, 13.3.1.5) and the standard conversion sequence
8028 // from the return type of F1 to the destination type (i.e.,
8029 // the type of the entity being initialized) is a better
8030 // conversion sequence than the standard conversion sequence
8031 // from the return type of F2 to the destination type.
Douglas Gregor8fcc5162010-09-12 08:07:23 +00008032 if (UserDefinedConversion && Cand1.Function && Cand2.Function &&
Mike Stump1eb44332009-09-09 15:08:12 +00008033 isa<CXXConversionDecl>(Cand1.Function) &&
Douglas Gregorf1991ea2008-11-07 22:36:19 +00008034 isa<CXXConversionDecl>(Cand2.Function)) {
Douglas Gregorb734e242012-02-22 17:32:19 +00008035 // First check whether we prefer one of the conversion functions over the
8036 // other. This only distinguishes the results in non-standard, extension
8037 // cases such as the conversion from a lambda closure type to a function
8038 // pointer or block.
8039 ImplicitConversionSequence::CompareKind FuncResult
8040 = compareConversionFunctions(S, Cand1.Function, Cand2.Function);
8041 if (FuncResult != ImplicitConversionSequence::Indistinguishable)
8042 return FuncResult;
8043
John McCall120d63c2010-08-24 20:38:10 +00008044 switch (CompareStandardConversionSequences(S,
8045 Cand1.FinalConversion,
Douglas Gregorf1991ea2008-11-07 22:36:19 +00008046 Cand2.FinalConversion)) {
8047 case ImplicitConversionSequence::Better:
8048 // Cand1 has a better conversion sequence.
8049 return true;
8050
8051 case ImplicitConversionSequence::Worse:
8052 // Cand1 can't be better than Cand2.
8053 return false;
8054
8055 case ImplicitConversionSequence::Indistinguishable:
8056 // Do nothing
8057 break;
8058 }
8059 }
8060
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008061 return false;
8062}
8063
Mike Stump1eb44332009-09-09 15:08:12 +00008064/// \brief Computes the best viable function (C++ 13.3.3)
Douglas Gregore0762c92009-06-19 23:52:42 +00008065/// within an overload candidate set.
8066///
James Dennettefce31f2012-06-22 08:10:18 +00008067/// \param Loc The location of the function name (or operator symbol) for
Douglas Gregore0762c92009-06-19 23:52:42 +00008068/// which overload resolution occurs.
8069///
James Dennettefce31f2012-06-22 08:10:18 +00008070/// \param Best If overload resolution was successful or found a deleted
8071/// function, \p Best points to the candidate function found.
Douglas Gregore0762c92009-06-19 23:52:42 +00008072///
8073/// \returns The result of overload resolution.
John McCall120d63c2010-08-24 20:38:10 +00008074OverloadingResult
8075OverloadCandidateSet::BestViableFunction(Sema &S, SourceLocation Loc,
Nick Lewycky7663f392010-11-20 01:29:55 +00008076 iterator &Best,
Chandler Carruth25ca4212011-02-25 19:41:05 +00008077 bool UserDefinedConversion) {
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008078 // Find the best viable function.
John McCall120d63c2010-08-24 20:38:10 +00008079 Best = end();
8080 for (iterator Cand = begin(); Cand != end(); ++Cand) {
8081 if (Cand->Viable)
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008082 if (Best == end() || isBetterOverloadCandidate(S, *Cand, *Best, Loc,
Douglas Gregor8fcc5162010-09-12 08:07:23 +00008083 UserDefinedConversion))
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008084 Best = Cand;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008085 }
8086
8087 // If we didn't find any viable functions, abort.
John McCall120d63c2010-08-24 20:38:10 +00008088 if (Best == end())
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008089 return OR_No_Viable_Function;
8090
8091 // Make sure that this function is better than every other viable
8092 // function. If not, we have an ambiguity.
John McCall120d63c2010-08-24 20:38:10 +00008093 for (iterator Cand = begin(); Cand != end(); ++Cand) {
Mike Stump1eb44332009-09-09 15:08:12 +00008094 if (Cand->Viable &&
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008095 Cand != Best &&
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008096 !isBetterOverloadCandidate(S, *Best, *Cand, Loc,
Douglas Gregor8fcc5162010-09-12 08:07:23 +00008097 UserDefinedConversion)) {
John McCall120d63c2010-08-24 20:38:10 +00008098 Best = end();
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008099 return OR_Ambiguous;
Douglas Gregor106c6eb2008-11-19 22:57:39 +00008100 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008101 }
Mike Stump1eb44332009-09-09 15:08:12 +00008102
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008103 // Best is the best viable function.
Douglas Gregor48f3bb92009-02-18 21:56:37 +00008104 if (Best->Function &&
Argyrios Kyrtzidis572bbec2011-06-23 00:41:50 +00008105 (Best->Function->isDeleted() ||
8106 S.isFunctionConsideredUnavailable(Best->Function)))
Douglas Gregor48f3bb92009-02-18 21:56:37 +00008107 return OR_Deleted;
8108
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00008109 return OR_Success;
8110}
8111
John McCall3c80f572010-01-12 02:15:36 +00008112namespace {
8113
8114enum OverloadCandidateKind {
8115 oc_function,
8116 oc_method,
8117 oc_constructor,
John McCall220ccbf2010-01-13 00:25:19 +00008118 oc_function_template,
8119 oc_method_template,
8120 oc_constructor_template,
John McCall3c80f572010-01-12 02:15:36 +00008121 oc_implicit_default_constructor,
8122 oc_implicit_copy_constructor,
Sean Hunt82713172011-05-25 23:16:36 +00008123 oc_implicit_move_constructor,
Sebastian Redlf677ea32011-02-05 19:23:19 +00008124 oc_implicit_copy_assignment,
Sean Hunt82713172011-05-25 23:16:36 +00008125 oc_implicit_move_assignment,
Sebastian Redlf677ea32011-02-05 19:23:19 +00008126 oc_implicit_inherited_constructor
John McCall3c80f572010-01-12 02:15:36 +00008127};
8128
John McCall220ccbf2010-01-13 00:25:19 +00008129OverloadCandidateKind ClassifyOverloadCandidate(Sema &S,
8130 FunctionDecl *Fn,
8131 std::string &Description) {
8132 bool isTemplate = false;
8133
8134 if (FunctionTemplateDecl *FunTmpl = Fn->getPrimaryTemplate()) {
8135 isTemplate = true;
8136 Description = S.getTemplateArgumentBindingsText(
8137 FunTmpl->getTemplateParameters(), *Fn->getTemplateSpecializationArgs());
8138 }
John McCallb1622a12010-01-06 09:43:14 +00008139
8140 if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
John McCall3c80f572010-01-12 02:15:36 +00008141 if (!Ctor->isImplicit())
John McCall220ccbf2010-01-13 00:25:19 +00008142 return isTemplate ? oc_constructor_template : oc_constructor;
John McCallb1622a12010-01-06 09:43:14 +00008143
Sebastian Redlf677ea32011-02-05 19:23:19 +00008144 if (Ctor->getInheritedConstructor())
8145 return oc_implicit_inherited_constructor;
8146
Sean Hunt82713172011-05-25 23:16:36 +00008147 if (Ctor->isDefaultConstructor())
8148 return oc_implicit_default_constructor;
8149
8150 if (Ctor->isMoveConstructor())
8151 return oc_implicit_move_constructor;
8152
8153 assert(Ctor->isCopyConstructor() &&
8154 "unexpected sort of implicit constructor");
8155 return oc_implicit_copy_constructor;
John McCallb1622a12010-01-06 09:43:14 +00008156 }
8157
8158 if (CXXMethodDecl *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
8159 // This actually gets spelled 'candidate function' for now, but
8160 // it doesn't hurt to split it out.
John McCall3c80f572010-01-12 02:15:36 +00008161 if (!Meth->isImplicit())
John McCall220ccbf2010-01-13 00:25:19 +00008162 return isTemplate ? oc_method_template : oc_method;
John McCallb1622a12010-01-06 09:43:14 +00008163
Sean Hunt82713172011-05-25 23:16:36 +00008164 if (Meth->isMoveAssignmentOperator())
8165 return oc_implicit_move_assignment;
8166
Douglas Gregoref7d78b2012-02-10 08:36:38 +00008167 if (Meth->isCopyAssignmentOperator())
8168 return oc_implicit_copy_assignment;
8169
8170 assert(isa<CXXConversionDecl>(Meth) && "expected conversion");
8171 return oc_method;
John McCall3c80f572010-01-12 02:15:36 +00008172 }
8173
John McCall220ccbf2010-01-13 00:25:19 +00008174 return isTemplate ? oc_function_template : oc_function;
John McCall3c80f572010-01-12 02:15:36 +00008175}
8176
Sebastian Redlf677ea32011-02-05 19:23:19 +00008177void MaybeEmitInheritedConstructorNote(Sema &S, FunctionDecl *Fn) {
8178 const CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(Fn);
8179 if (!Ctor) return;
8180
8181 Ctor = Ctor->getInheritedConstructor();
8182 if (!Ctor) return;
8183
8184 S.Diag(Ctor->getLocation(), diag::note_ovl_candidate_inherited_constructor);
8185}
8186
John McCall3c80f572010-01-12 02:15:36 +00008187} // end anonymous namespace
8188
8189// Notes the location of an overload candidate.
Richard Trieu6efd4c52011-11-23 22:32:32 +00008190void Sema::NoteOverloadCandidate(FunctionDecl *Fn, QualType DestType) {
John McCall220ccbf2010-01-13 00:25:19 +00008191 std::string FnDesc;
8192 OverloadCandidateKind K = ClassifyOverloadCandidate(*this, Fn, FnDesc);
Richard Trieu6efd4c52011-11-23 22:32:32 +00008193 PartialDiagnostic PD = PDiag(diag::note_ovl_candidate)
8194 << (unsigned) K << FnDesc;
8195 HandleFunctionTypeMismatch(PD, Fn->getType(), DestType);
8196 Diag(Fn->getLocation(), PD);
Sebastian Redlf677ea32011-02-05 19:23:19 +00008197 MaybeEmitInheritedConstructorNote(*this, Fn);
John McCallb1622a12010-01-06 09:43:14 +00008198}
8199
Douglas Gregor1be8eec2011-02-19 21:32:49 +00008200//Notes the location of all overload candidates designated through
8201// OverloadedExpr
Richard Trieu6efd4c52011-11-23 22:32:32 +00008202void Sema::NoteAllOverloadCandidates(Expr* OverloadedExpr, QualType DestType) {
Douglas Gregor1be8eec2011-02-19 21:32:49 +00008203 assert(OverloadedExpr->getType() == Context.OverloadTy);
8204
8205 OverloadExpr::FindResult Ovl = OverloadExpr::find(OverloadedExpr);
8206 OverloadExpr *OvlExpr = Ovl.Expression;
8207
8208 for (UnresolvedSetIterator I = OvlExpr->decls_begin(),
8209 IEnd = OvlExpr->decls_end();
8210 I != IEnd; ++I) {
8211 if (FunctionTemplateDecl *FunTmpl =
8212 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
Richard Trieu6efd4c52011-11-23 22:32:32 +00008213 NoteOverloadCandidate(FunTmpl->getTemplatedDecl(), DestType);
Douglas Gregor1be8eec2011-02-19 21:32:49 +00008214 } else if (FunctionDecl *Fun
8215 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
Richard Trieu6efd4c52011-11-23 22:32:32 +00008216 NoteOverloadCandidate(Fun, DestType);
Douglas Gregor1be8eec2011-02-19 21:32:49 +00008217 }
8218 }
8219}
8220
John McCall1d318332010-01-12 00:44:57 +00008221/// Diagnoses an ambiguous conversion. The partial diagnostic is the
8222/// "lead" diagnostic; it will be given two arguments, the source and
8223/// target types of the conversion.
John McCall120d63c2010-08-24 20:38:10 +00008224void ImplicitConversionSequence::DiagnoseAmbiguousConversion(
8225 Sema &S,
8226 SourceLocation CaretLoc,
8227 const PartialDiagnostic &PDiag) const {
8228 S.Diag(CaretLoc, PDiag)
8229 << Ambiguous.getFromType() << Ambiguous.getToType();
Matt Beaumont-Gay45a37da2012-11-08 20:50:02 +00008230 // FIXME: The note limiting machinery is borrowed from
8231 // OverloadCandidateSet::NoteCandidates; there's an opportunity for
8232 // refactoring here.
8233 const OverloadsShown ShowOverloads = S.Diags.getShowOverloads();
8234 unsigned CandsShown = 0;
8235 AmbiguousConversionSequence::const_iterator I, E;
8236 for (I = Ambiguous.begin(), E = Ambiguous.end(); I != E; ++I) {
8237 if (CandsShown >= 4 && ShowOverloads == Ovl_Best)
8238 break;
8239 ++CandsShown;
John McCall120d63c2010-08-24 20:38:10 +00008240 S.NoteOverloadCandidate(*I);
John McCall1d318332010-01-12 00:44:57 +00008241 }
Matt Beaumont-Gay45a37da2012-11-08 20:50:02 +00008242 if (I != E)
8243 S.Diag(SourceLocation(), diag::note_ovl_too_many_candidates) << int(E - I);
John McCall81201622010-01-08 04:41:39 +00008244}
8245
John McCall1d318332010-01-12 00:44:57 +00008246namespace {
8247
John McCalladbb8f82010-01-13 09:16:55 +00008248void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I) {
8249 const ImplicitConversionSequence &Conv = Cand->Conversions[I];
8250 assert(Conv.isBad());
John McCall220ccbf2010-01-13 00:25:19 +00008251 assert(Cand->Function && "for now, candidate must be a function");
8252 FunctionDecl *Fn = Cand->Function;
8253
8254 // There's a conversion slot for the object argument if this is a
8255 // non-constructor method. Note that 'I' corresponds the
8256 // conversion-slot index.
John McCalladbb8f82010-01-13 09:16:55 +00008257 bool isObjectArgument = false;
John McCall220ccbf2010-01-13 00:25:19 +00008258 if (isa<CXXMethodDecl>(Fn) && !isa<CXXConstructorDecl>(Fn)) {
John McCalladbb8f82010-01-13 09:16:55 +00008259 if (I == 0)
8260 isObjectArgument = true;
8261 else
8262 I--;
John McCall220ccbf2010-01-13 00:25:19 +00008263 }
8264
John McCall220ccbf2010-01-13 00:25:19 +00008265 std::string FnDesc;
8266 OverloadCandidateKind FnKind = ClassifyOverloadCandidate(S, Fn, FnDesc);
8267
John McCalladbb8f82010-01-13 09:16:55 +00008268 Expr *FromExpr = Conv.Bad.FromExpr;
8269 QualType FromTy = Conv.Bad.getFromType();
8270 QualType ToTy = Conv.Bad.getToType();
John McCall220ccbf2010-01-13 00:25:19 +00008271
John McCall5920dbb2010-02-02 02:42:52 +00008272 if (FromTy == S.Context.OverloadTy) {
John McCallb1bdc622010-02-25 01:37:24 +00008273 assert(FromExpr && "overload set argument came from implicit argument?");
John McCall5920dbb2010-02-02 02:42:52 +00008274 Expr *E = FromExpr->IgnoreParens();
8275 if (isa<UnaryOperator>(E))
8276 E = cast<UnaryOperator>(E)->getSubExpr()->IgnoreParens();
John McCall7bb12da2010-02-02 06:20:04 +00008277 DeclarationName Name = cast<OverloadExpr>(E)->getName();
John McCall5920dbb2010-02-02 02:42:52 +00008278
8279 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
8280 << (unsigned) FnKind << FnDesc
8281 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8282 << ToTy << Name << I+1;
Sebastian Redlf677ea32011-02-05 19:23:19 +00008283 MaybeEmitInheritedConstructorNote(S, Fn);
John McCall5920dbb2010-02-02 02:42:52 +00008284 return;
8285 }
8286
John McCall258b2032010-01-23 08:10:49 +00008287 // Do some hand-waving analysis to see if the non-viability is due
8288 // to a qualifier mismatch.
John McCall651f3ee2010-01-14 03:28:57 +00008289 CanQualType CFromTy = S.Context.getCanonicalType(FromTy);
8290 CanQualType CToTy = S.Context.getCanonicalType(ToTy);
8291 if (CanQual<ReferenceType> RT = CToTy->getAs<ReferenceType>())
8292 CToTy = RT->getPointeeType();
8293 else {
8294 // TODO: detect and diagnose the full richness of const mismatches.
8295 if (CanQual<PointerType> FromPT = CFromTy->getAs<PointerType>())
8296 if (CanQual<PointerType> ToPT = CToTy->getAs<PointerType>())
8297 CFromTy = FromPT->getPointeeType(), CToTy = ToPT->getPointeeType();
8298 }
8299
8300 if (CToTy.getUnqualifiedType() == CFromTy.getUnqualifiedType() &&
8301 !CToTy.isAtLeastAsQualifiedAs(CFromTy)) {
John McCall651f3ee2010-01-14 03:28:57 +00008302 Qualifiers FromQs = CFromTy.getQualifiers();
8303 Qualifiers ToQs = CToTy.getQualifiers();
8304
8305 if (FromQs.getAddressSpace() != ToQs.getAddressSpace()) {
8306 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
8307 << (unsigned) FnKind << FnDesc
8308 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8309 << FromTy
8310 << FromQs.getAddressSpace() << ToQs.getAddressSpace()
8311 << (unsigned) isObjectArgument << I+1;
Sebastian Redlf677ea32011-02-05 19:23:19 +00008312 MaybeEmitInheritedConstructorNote(S, Fn);
John McCall651f3ee2010-01-14 03:28:57 +00008313 return;
8314 }
8315
John McCallf85e1932011-06-15 23:02:42 +00008316 if (FromQs.getObjCLifetime() != ToQs.getObjCLifetime()) {
Argyrios Kyrtzidisb8b03132011-06-24 00:08:59 +00008317 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
John McCallf85e1932011-06-15 23:02:42 +00008318 << (unsigned) FnKind << FnDesc
8319 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8320 << FromTy
8321 << FromQs.getObjCLifetime() << ToQs.getObjCLifetime()
8322 << (unsigned) isObjectArgument << I+1;
8323 MaybeEmitInheritedConstructorNote(S, Fn);
8324 return;
8325 }
8326
Douglas Gregor028ea4b2011-04-26 23:16:46 +00008327 if (FromQs.getObjCGCAttr() != ToQs.getObjCGCAttr()) {
8328 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
8329 << (unsigned) FnKind << FnDesc
8330 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8331 << FromTy
8332 << FromQs.getObjCGCAttr() << ToQs.getObjCGCAttr()
8333 << (unsigned) isObjectArgument << I+1;
8334 MaybeEmitInheritedConstructorNote(S, Fn);
8335 return;
8336 }
8337
John McCall651f3ee2010-01-14 03:28:57 +00008338 unsigned CVR = FromQs.getCVRQualifiers() & ~ToQs.getCVRQualifiers();
8339 assert(CVR && "unexpected qualifiers mismatch");
8340
8341 if (isObjectArgument) {
8342 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
8343 << (unsigned) FnKind << FnDesc
8344 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8345 << FromTy << (CVR - 1);
8346 } else {
8347 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
8348 << (unsigned) FnKind << FnDesc
8349 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8350 << FromTy << (CVR - 1) << I+1;
8351 }
Sebastian Redlf677ea32011-02-05 19:23:19 +00008352 MaybeEmitInheritedConstructorNote(S, Fn);
John McCall651f3ee2010-01-14 03:28:57 +00008353 return;
8354 }
8355
Sebastian Redlfd2a00a2011-09-24 17:48:32 +00008356 // Special diagnostic for failure to convert an initializer list, since
8357 // telling the user that it has type void is not useful.
8358 if (FromExpr && isa<InitListExpr>(FromExpr)) {
8359 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
8360 << (unsigned) FnKind << FnDesc
8361 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8362 << FromTy << ToTy << (unsigned) isObjectArgument << I+1;
8363 MaybeEmitInheritedConstructorNote(S, Fn);
8364 return;
8365 }
8366
John McCall258b2032010-01-23 08:10:49 +00008367 // Diagnose references or pointers to incomplete types differently,
8368 // since it's far from impossible that the incompleteness triggered
8369 // the failure.
8370 QualType TempFromTy = FromTy.getNonReferenceType();
8371 if (const PointerType *PTy = TempFromTy->getAs<PointerType>())
8372 TempFromTy = PTy->getPointeeType();
8373 if (TempFromTy->isIncompleteType()) {
8374 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
8375 << (unsigned) FnKind << FnDesc
8376 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8377 << FromTy << ToTy << (unsigned) isObjectArgument << I+1;
Sebastian Redlf677ea32011-02-05 19:23:19 +00008378 MaybeEmitInheritedConstructorNote(S, Fn);
John McCall258b2032010-01-23 08:10:49 +00008379 return;
8380 }
8381
Douglas Gregor85789812010-06-30 23:01:39 +00008382 // Diagnose base -> derived pointer conversions.
Douglas Gregor2f9d8742010-07-01 02:14:45 +00008383 unsigned BaseToDerivedConversion = 0;
Douglas Gregor85789812010-06-30 23:01:39 +00008384 if (const PointerType *FromPtrTy = FromTy->getAs<PointerType>()) {
8385 if (const PointerType *ToPtrTy = ToTy->getAs<PointerType>()) {
8386 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
8387 FromPtrTy->getPointeeType()) &&
8388 !FromPtrTy->getPointeeType()->isIncompleteType() &&
8389 !ToPtrTy->getPointeeType()->isIncompleteType() &&
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008390 S.IsDerivedFrom(ToPtrTy->getPointeeType(),
Douglas Gregor85789812010-06-30 23:01:39 +00008391 FromPtrTy->getPointeeType()))
Douglas Gregor2f9d8742010-07-01 02:14:45 +00008392 BaseToDerivedConversion = 1;
Douglas Gregor85789812010-06-30 23:01:39 +00008393 }
8394 } else if (const ObjCObjectPointerType *FromPtrTy
8395 = FromTy->getAs<ObjCObjectPointerType>()) {
8396 if (const ObjCObjectPointerType *ToPtrTy
8397 = ToTy->getAs<ObjCObjectPointerType>())
8398 if (const ObjCInterfaceDecl *FromIface = FromPtrTy->getInterfaceDecl())
8399 if (const ObjCInterfaceDecl *ToIface = ToPtrTy->getInterfaceDecl())
8400 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
8401 FromPtrTy->getPointeeType()) &&
8402 FromIface->isSuperClassOf(ToIface))
Douglas Gregor2f9d8742010-07-01 02:14:45 +00008403 BaseToDerivedConversion = 2;
8404 } else if (const ReferenceType *ToRefTy = ToTy->getAs<ReferenceType>()) {
Kaelyn Uhrain0d3317e2012-06-19 00:37:47 +00008405 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy) &&
8406 !FromTy->isIncompleteType() &&
8407 !ToRefTy->getPointeeType()->isIncompleteType() &&
8408 S.IsDerivedFrom(ToRefTy->getPointeeType(), FromTy)) {
8409 BaseToDerivedConversion = 3;
8410 } else if (ToTy->isLValueReferenceType() && !FromExpr->isLValue() &&
8411 ToTy.getNonReferenceType().getCanonicalType() ==
8412 FromTy.getNonReferenceType().getCanonicalType()) {
Kaelyn Uhrain0d3317e2012-06-19 00:37:47 +00008413 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_lvalue)
8414 << (unsigned) FnKind << FnDesc
8415 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8416 << (unsigned) isObjectArgument << I + 1;
8417 MaybeEmitInheritedConstructorNote(S, Fn);
8418 return;
Douglas Gregor2f9d8742010-07-01 02:14:45 +00008419 }
Kaelyn Uhrain0d3317e2012-06-19 00:37:47 +00008420 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008421
Douglas Gregor2f9d8742010-07-01 02:14:45 +00008422 if (BaseToDerivedConversion) {
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008423 S.Diag(Fn->getLocation(),
Douglas Gregor2f9d8742010-07-01 02:14:45 +00008424 diag::note_ovl_candidate_bad_base_to_derived_conv)
Douglas Gregor85789812010-06-30 23:01:39 +00008425 << (unsigned) FnKind << FnDesc
8426 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
Douglas Gregor2f9d8742010-07-01 02:14:45 +00008427 << (BaseToDerivedConversion - 1)
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008428 << FromTy << ToTy << I+1;
Sebastian Redlf677ea32011-02-05 19:23:19 +00008429 MaybeEmitInheritedConstructorNote(S, Fn);
Douglas Gregor85789812010-06-30 23:01:39 +00008430 return;
8431 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008432
Fariborz Jahanian909bcb32011-07-20 17:14:09 +00008433 if (isa<ObjCObjectPointerType>(CFromTy) &&
8434 isa<PointerType>(CToTy)) {
8435 Qualifiers FromQs = CFromTy.getQualifiers();
8436 Qualifiers ToQs = CToTy.getQualifiers();
8437 if (FromQs.getObjCLifetime() != ToQs.getObjCLifetime()) {
8438 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
8439 << (unsigned) FnKind << FnDesc
8440 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
8441 << FromTy << ToTy << (unsigned) isObjectArgument << I+1;
8442 MaybeEmitInheritedConstructorNote(S, Fn);
8443 return;
8444 }
8445 }
8446
Anna Zaksb89fe6b2011-07-19 19:49:12 +00008447 // Emit the generic diagnostic and, optionally, add the hints to it.
8448 PartialDiagnostic FDiag = S.PDiag(diag::note_ovl_candidate_bad_conv);
8449 FDiag << (unsigned) FnKind << FnDesc
John McCalladbb8f82010-01-13 09:16:55 +00008450 << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
Anna Zaksb89fe6b2011-07-19 19:49:12 +00008451 << FromTy << ToTy << (unsigned) isObjectArgument << I + 1
8452 << (unsigned) (Cand->Fix.Kind);
8453
8454 // If we can fix the conversion, suggest the FixIts.
Benjamin Kramer1136ef02012-01-14 21:05:10 +00008455 for (std::vector<FixItHint>::iterator HI = Cand->Fix.Hints.begin(),
8456 HE = Cand->Fix.Hints.end(); HI != HE; ++HI)
Anna Zaksb89fe6b2011-07-19 19:49:12 +00008457 FDiag << *HI;
8458 S.Diag(Fn->getLocation(), FDiag);
8459
Sebastian Redlf677ea32011-02-05 19:23:19 +00008460 MaybeEmitInheritedConstructorNote(S, Fn);
John McCalladbb8f82010-01-13 09:16:55 +00008461}
8462
8463void DiagnoseArityMismatch(Sema &S, OverloadCandidate *Cand,
8464 unsigned NumFormalArgs) {
8465 // TODO: treat calls to a missing default constructor as a special case
8466
8467 FunctionDecl *Fn = Cand->Function;
8468 const FunctionProtoType *FnTy = Fn->getType()->getAs<FunctionProtoType>();
8469
8470 unsigned MinParams = Fn->getMinRequiredArguments();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008471
Douglas Gregor439d3c32011-05-05 00:13:13 +00008472 // With invalid overloaded operators, it's possible that we think we
8473 // have an arity mismatch when it fact it looks like we have the
8474 // right number of arguments, because only overloaded operators have
8475 // the weird behavior of overloading member and non-member functions.
8476 // Just don't report anything.
8477 if (Fn->isInvalidDecl() &&
8478 Fn->getDeclName().getNameKind() == DeclarationName::CXXOperatorName)
8479 return;
8480
John McCalladbb8f82010-01-13 09:16:55 +00008481 // at least / at most / exactly
8482 unsigned mode, modeCount;
8483 if (NumFormalArgs < MinParams) {
Douglas Gregora18592e2010-05-08 18:13:28 +00008484 assert((Cand->FailureKind == ovl_fail_too_few_arguments) ||
8485 (Cand->FailureKind == ovl_fail_bad_deduction &&
8486 Cand->DeductionFailure.Result == Sema::TDK_TooFewArguments));
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008487 if (MinParams != FnTy->getNumArgs() ||
Douglas Gregorf5c65ff2011-01-06 22:09:01 +00008488 FnTy->isVariadic() || FnTy->isTemplateVariadic())
John McCalladbb8f82010-01-13 09:16:55 +00008489 mode = 0; // "at least"
8490 else
8491 mode = 2; // "exactly"
8492 modeCount = MinParams;
8493 } else {
Douglas Gregora18592e2010-05-08 18:13:28 +00008494 assert((Cand->FailureKind == ovl_fail_too_many_arguments) ||
8495 (Cand->FailureKind == ovl_fail_bad_deduction &&
8496 Cand->DeductionFailure.Result == Sema::TDK_TooManyArguments));
John McCalladbb8f82010-01-13 09:16:55 +00008497 if (MinParams != FnTy->getNumArgs())
8498 mode = 1; // "at most"
8499 else
8500 mode = 2; // "exactly"
8501 modeCount = FnTy->getNumArgs();
8502 }
8503
8504 std::string Description;
8505 OverloadCandidateKind FnKind = ClassifyOverloadCandidate(S, Fn, Description);
8506
Richard Smithf7b80562012-05-11 05:16:41 +00008507 if (modeCount == 1 && Fn->getParamDecl(0)->getDeclName())
8508 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
8509 << (unsigned) FnKind << (Fn->getDescribedFunctionTemplate() != 0) << mode
8510 << Fn->getParamDecl(0) << NumFormalArgs;
8511 else
8512 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
8513 << (unsigned) FnKind << (Fn->getDescribedFunctionTemplate() != 0) << mode
8514 << modeCount << NumFormalArgs;
Sebastian Redlf677ea32011-02-05 19:23:19 +00008515 MaybeEmitInheritedConstructorNote(S, Fn);
John McCall220ccbf2010-01-13 00:25:19 +00008516}
8517
John McCall342fec42010-02-01 18:53:26 +00008518/// Diagnose a failed template-argument deduction.
8519void DiagnoseBadDeduction(Sema &S, OverloadCandidate *Cand,
Ahmed Charles13a140c2012-02-25 11:00:22 +00008520 unsigned NumArgs) {
John McCall342fec42010-02-01 18:53:26 +00008521 FunctionDecl *Fn = Cand->Function; // pattern
8522
Douglas Gregora9333192010-05-08 17:41:32 +00008523 TemplateParameter Param = Cand->DeductionFailure.getTemplateParameter();
Douglas Gregorf1a84452010-05-08 19:15:54 +00008524 NamedDecl *ParamD;
8525 (ParamD = Param.dyn_cast<TemplateTypeParmDecl*>()) ||
8526 (ParamD = Param.dyn_cast<NonTypeTemplateParmDecl*>()) ||
8527 (ParamD = Param.dyn_cast<TemplateTemplateParmDecl*>());
John McCall342fec42010-02-01 18:53:26 +00008528 switch (Cand->DeductionFailure.Result) {
8529 case Sema::TDK_Success:
8530 llvm_unreachable("TDK_success while diagnosing bad deduction");
8531
8532 case Sema::TDK_Incomplete: {
John McCall342fec42010-02-01 18:53:26 +00008533 assert(ParamD && "no parameter found for incomplete deduction result");
8534 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_incomplete_deduction)
8535 << ParamD->getDeclName();
Sebastian Redlf677ea32011-02-05 19:23:19 +00008536 MaybeEmitInheritedConstructorNote(S, Fn);
John McCall342fec42010-02-01 18:53:26 +00008537 return;
8538 }
8539
John McCall57e97782010-08-05 09:05:08 +00008540 case Sema::TDK_Underqualified: {
8541 assert(ParamD && "no parameter found for bad qualifiers deduction result");
8542 TemplateTypeParmDecl *TParam = cast<TemplateTypeParmDecl>(ParamD);
8543
8544 QualType Param = Cand->DeductionFailure.getFirstArg()->getAsType();
8545
8546 // Param will have been canonicalized, but it should just be a
8547 // qualified version of ParamD, so move the qualifiers to that.
John McCall49f4e1c2010-12-10 11:01:00 +00008548 QualifierCollector Qs;
John McCall57e97782010-08-05 09:05:08 +00008549 Qs.strip(Param);
John McCall49f4e1c2010-12-10 11:01:00 +00008550 QualType NonCanonParam = Qs.apply(S.Context, TParam->getTypeForDecl());
John McCall57e97782010-08-05 09:05:08 +00008551 assert(S.Context.hasSameType(Param, NonCanonParam));
8552
8553 // Arg has also been canonicalized, but there's nothing we can do
8554 // about that. It also doesn't matter as much, because it won't
8555 // have any template parameters in it (because deduction isn't
8556 // done on dependent types).
8557 QualType Arg = Cand->DeductionFailure.getSecondArg()->getAsType();
8558
8559 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_underqualified)
8560 << ParamD->getDeclName() << Arg << NonCanonParam;
Sebastian Redlf677ea32011-02-05 19:23:19 +00008561 MaybeEmitInheritedConstructorNote(S, Fn);
John McCall57e97782010-08-05 09:05:08 +00008562 return;
8563 }
8564
8565 case Sema::TDK_Inconsistent: {
Chandler Carruth6df868e2010-12-12 08:17:55 +00008566 assert(ParamD && "no parameter found for inconsistent deduction result");
Douglas Gregora9333192010-05-08 17:41:32 +00008567 int which = 0;
Douglas Gregorf1a84452010-05-08 19:15:54 +00008568 if (isa<TemplateTypeParmDecl>(ParamD))
Douglas Gregora9333192010-05-08 17:41:32 +00008569 which = 0;
Douglas Gregorf1a84452010-05-08 19:15:54 +00008570 else if (isa<NonTypeTemplateParmDecl>(ParamD))
Douglas Gregora9333192010-05-08 17:41:32 +00008571 which = 1;
8572 else {
Douglas Gregora9333192010-05-08 17:41:32 +00008573 which = 2;
8574 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008575
Douglas Gregora9333192010-05-08 17:41:32 +00008576 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_inconsistent_deduction)
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008577 << which << ParamD->getDeclName()
Douglas Gregora9333192010-05-08 17:41:32 +00008578 << *Cand->DeductionFailure.getFirstArg()
8579 << *Cand->DeductionFailure.getSecondArg();
Sebastian Redlf677ea32011-02-05 19:23:19 +00008580 MaybeEmitInheritedConstructorNote(S, Fn);
Douglas Gregora9333192010-05-08 17:41:32 +00008581 return;
8582 }
Douglas Gregora18592e2010-05-08 18:13:28 +00008583
Douglas Gregorf1a84452010-05-08 19:15:54 +00008584 case Sema::TDK_InvalidExplicitArguments:
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008585 assert(ParamD && "no parameter found for invalid explicit arguments");
Douglas Gregorf1a84452010-05-08 19:15:54 +00008586 if (ParamD->getDeclName())
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008587 S.Diag(Fn->getLocation(),
Douglas Gregorf1a84452010-05-08 19:15:54 +00008588 diag::note_ovl_candidate_explicit_arg_mismatch_named)
8589 << ParamD->getDeclName();
8590 else {
8591 int index = 0;
8592 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(ParamD))
8593 index = TTP->getIndex();
8594 else if (NonTypeTemplateParmDecl *NTTP
8595 = dyn_cast<NonTypeTemplateParmDecl>(ParamD))
8596 index = NTTP->getIndex();
8597 else
8598 index = cast<TemplateTemplateParmDecl>(ParamD)->getIndex();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008599 S.Diag(Fn->getLocation(),
Douglas Gregorf1a84452010-05-08 19:15:54 +00008600 diag::note_ovl_candidate_explicit_arg_mismatch_unnamed)
8601 << (index + 1);
8602 }
Sebastian Redlf677ea32011-02-05 19:23:19 +00008603 MaybeEmitInheritedConstructorNote(S, Fn);
Douglas Gregorf1a84452010-05-08 19:15:54 +00008604 return;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008605
Douglas Gregora18592e2010-05-08 18:13:28 +00008606 case Sema::TDK_TooManyArguments:
8607 case Sema::TDK_TooFewArguments:
8608 DiagnoseArityMismatch(S, Cand, NumArgs);
8609 return;
Douglas Gregorec20f462010-05-08 20:07:26 +00008610
8611 case Sema::TDK_InstantiationDepth:
8612 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_instantiation_depth);
Sebastian Redlf677ea32011-02-05 19:23:19 +00008613 MaybeEmitInheritedConstructorNote(S, Fn);
Douglas Gregorec20f462010-05-08 20:07:26 +00008614 return;
8615
8616 case Sema::TDK_SubstitutionFailure: {
Richard Smithb8590f32012-05-07 09:03:25 +00008617 // Format the template argument list into the argument string.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00008618 SmallString<128> TemplateArgString;
Richard Smithb8590f32012-05-07 09:03:25 +00008619 if (TemplateArgumentList *Args =
8620 Cand->DeductionFailure.getTemplateArgumentList()) {
8621 TemplateArgString = " ";
8622 TemplateArgString += S.getTemplateArgumentBindingsText(
8623 Fn->getDescribedFunctionTemplate()->getTemplateParameters(), *Args);
8624 }
8625
Richard Smith4493c0a2012-05-09 05:17:00 +00008626 // If this candidate was disabled by enable_if, say so.
8627 PartialDiagnosticAt *PDiag = Cand->DeductionFailure.getSFINAEDiagnostic();
8628 if (PDiag && PDiag->second.getDiagID() ==
8629 diag::err_typename_nested_not_found_enable_if) {
8630 // FIXME: Use the source range of the condition, and the fully-qualified
8631 // name of the enable_if template. These are both present in PDiag.
8632 S.Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
8633 << "'enable_if'" << TemplateArgString;
8634 return;
8635 }
8636
Richard Smithb8590f32012-05-07 09:03:25 +00008637 // Format the SFINAE diagnostic into the argument string.
8638 // FIXME: Add a general mechanism to include a PartialDiagnostic *'s
8639 // formatted message in another diagnostic.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00008640 SmallString<128> SFINAEArgString;
Richard Smithb8590f32012-05-07 09:03:25 +00008641 SourceRange R;
Richard Smith4493c0a2012-05-09 05:17:00 +00008642 if (PDiag) {
Richard Smithb8590f32012-05-07 09:03:25 +00008643 SFINAEArgString = ": ";
8644 R = SourceRange(PDiag->first, PDiag->first);
8645 PDiag->second.EmitToString(S.getDiagnostics(), SFINAEArgString);
8646 }
8647
Douglas Gregorec20f462010-05-08 20:07:26 +00008648 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_substitution_failure)
Richard Smithb8590f32012-05-07 09:03:25 +00008649 << TemplateArgString << SFINAEArgString << R;
Sebastian Redlf677ea32011-02-05 19:23:19 +00008650 MaybeEmitInheritedConstructorNote(S, Fn);
Douglas Gregorec20f462010-05-08 20:07:26 +00008651 return;
8652 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008653
Richard Smith0efa62f2013-01-31 04:03:12 +00008654 case Sema::TDK_FailedOverloadResolution: {
8655 OverloadExpr::FindResult R =
8656 OverloadExpr::find(Cand->DeductionFailure.getExpr());
8657 S.Diag(Fn->getLocation(),
8658 diag::note_ovl_candidate_failed_overload_resolution)
8659 << R.Expression->getName();
8660 return;
8661 }
8662
Richard Trieueef35f82013-04-08 21:11:40 +00008663 case Sema::TDK_NonDeducedMismatch: {
Richard Smith29805ca2013-01-31 05:19:49 +00008664 // FIXME: Provide a source location to indicate what we couldn't match.
Richard Trieueef35f82013-04-08 21:11:40 +00008665 TemplateArgument FirstTA = *Cand->DeductionFailure.getFirstArg();
8666 TemplateArgument SecondTA = *Cand->DeductionFailure.getSecondArg();
8667 if (FirstTA.getKind() == TemplateArgument::Template &&
8668 SecondTA.getKind() == TemplateArgument::Template) {
8669 TemplateName FirstTN = FirstTA.getAsTemplate();
8670 TemplateName SecondTN = SecondTA.getAsTemplate();
8671 if (FirstTN.getKind() == TemplateName::Template &&
8672 SecondTN.getKind() == TemplateName::Template) {
8673 if (FirstTN.getAsTemplateDecl()->getName() ==
8674 SecondTN.getAsTemplateDecl()->getName()) {
8675 // FIXME: This fixes a bad diagnostic where both templates are named
8676 // the same. This particular case is a bit difficult since:
8677 // 1) It is passed as a string to the diagnostic printer.
8678 // 2) The diagnostic printer only attempts to find a better
8679 // name for types, not decls.
8680 // Ideally, this should folded into the diagnostic printer.
8681 S.Diag(Fn->getLocation(),
8682 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
8683 << FirstTN.getAsTemplateDecl() << SecondTN.getAsTemplateDecl();
8684 return;
8685 }
8686 }
8687 }
Richard Smith29805ca2013-01-31 05:19:49 +00008688 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_non_deduced_mismatch)
Richard Trieueef35f82013-04-08 21:11:40 +00008689 << FirstTA << SecondTA;
Richard Smith29805ca2013-01-31 05:19:49 +00008690 return;
Richard Trieueef35f82013-04-08 21:11:40 +00008691 }
John McCall342fec42010-02-01 18:53:26 +00008692 // TODO: diagnose these individually, then kill off
8693 // note_ovl_candidate_bad_deduction, which is uselessly vague.
Richard Smith29805ca2013-01-31 05:19:49 +00008694 case Sema::TDK_MiscellaneousDeductionFailure:
John McCall342fec42010-02-01 18:53:26 +00008695 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_deduction);
Sebastian Redlf677ea32011-02-05 19:23:19 +00008696 MaybeEmitInheritedConstructorNote(S, Fn);
John McCall342fec42010-02-01 18:53:26 +00008697 return;
8698 }
8699}
8700
Peter Collingbourne78dd67e2011-10-02 23:49:40 +00008701/// CUDA: diagnose an invalid call across targets.
8702void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) {
8703 FunctionDecl *Caller = cast<FunctionDecl>(S.CurContext);
8704 FunctionDecl *Callee = Cand->Function;
8705
8706 Sema::CUDAFunctionTarget CallerTarget = S.IdentifyCUDATarget(Caller),
8707 CalleeTarget = S.IdentifyCUDATarget(Callee);
8708
8709 std::string FnDesc;
8710 OverloadCandidateKind FnKind = ClassifyOverloadCandidate(S, Callee, FnDesc);
8711
8712 S.Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
8713 << (unsigned) FnKind << CalleeTarget << CallerTarget;
8714}
8715
John McCall342fec42010-02-01 18:53:26 +00008716/// Generates a 'note' diagnostic for an overload candidate. We've
8717/// already generated a primary error at the call site.
8718///
8719/// It really does need to be a single diagnostic with its caret
8720/// pointed at the candidate declaration. Yes, this creates some
8721/// major challenges of technical writing. Yes, this makes pointing
8722/// out problems with specific arguments quite awkward. It's still
8723/// better than generating twenty screens of text for every failed
8724/// overload.
8725///
8726/// It would be great to be able to express per-candidate problems
8727/// more richly for those diagnostic clients that cared, but we'd
8728/// still have to be just as careful with the default diagnostics.
John McCall220ccbf2010-01-13 00:25:19 +00008729void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand,
Ahmed Charles13a140c2012-02-25 11:00:22 +00008730 unsigned NumArgs) {
John McCall3c80f572010-01-12 02:15:36 +00008731 FunctionDecl *Fn = Cand->Function;
8732
John McCall81201622010-01-08 04:41:39 +00008733 // Note deleted candidates, but only if they're viable.
Argyrios Kyrtzidis572bbec2011-06-23 00:41:50 +00008734 if (Cand->Viable && (Fn->isDeleted() ||
8735 S.isFunctionConsideredUnavailable(Fn))) {
John McCall220ccbf2010-01-13 00:25:19 +00008736 std::string FnDesc;
8737 OverloadCandidateKind FnKind = ClassifyOverloadCandidate(S, Fn, FnDesc);
John McCall3c80f572010-01-12 02:15:36 +00008738
8739 S.Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
Richard Smith5bdaac52012-04-02 20:59:25 +00008740 << FnKind << FnDesc
8741 << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0);
Sebastian Redlf677ea32011-02-05 19:23:19 +00008742 MaybeEmitInheritedConstructorNote(S, Fn);
John McCalla1d7d622010-01-08 00:58:21 +00008743 return;
John McCall81201622010-01-08 04:41:39 +00008744 }
8745
John McCall220ccbf2010-01-13 00:25:19 +00008746 // We don't really have anything else to say about viable candidates.
8747 if (Cand->Viable) {
8748 S.NoteOverloadCandidate(Fn);
8749 return;
8750 }
John McCall1d318332010-01-12 00:44:57 +00008751
John McCalladbb8f82010-01-13 09:16:55 +00008752 switch (Cand->FailureKind) {
8753 case ovl_fail_too_many_arguments:
8754 case ovl_fail_too_few_arguments:
8755 return DiagnoseArityMismatch(S, Cand, NumArgs);
John McCall220ccbf2010-01-13 00:25:19 +00008756
John McCalladbb8f82010-01-13 09:16:55 +00008757 case ovl_fail_bad_deduction:
Ahmed Charles13a140c2012-02-25 11:00:22 +00008758 return DiagnoseBadDeduction(S, Cand, NumArgs);
John McCall342fec42010-02-01 18:53:26 +00008759
John McCall717e8912010-01-23 05:17:32 +00008760 case ovl_fail_trivial_conversion:
8761 case ovl_fail_bad_final_conversion:
Douglas Gregorc520c842010-04-12 23:42:09 +00008762 case ovl_fail_final_conversion_not_exact:
John McCalladbb8f82010-01-13 09:16:55 +00008763 return S.NoteOverloadCandidate(Fn);
John McCall220ccbf2010-01-13 00:25:19 +00008764
John McCallb1bdc622010-02-25 01:37:24 +00008765 case ovl_fail_bad_conversion: {
8766 unsigned I = (Cand->IgnoreObjectArgument ? 1 : 0);
Benjamin Kramer09dd3792012-01-14 16:32:05 +00008767 for (unsigned N = Cand->NumConversions; I != N; ++I)
John McCalladbb8f82010-01-13 09:16:55 +00008768 if (Cand->Conversions[I].isBad())
8769 return DiagnoseBadConversion(S, Cand, I);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00008770
John McCalladbb8f82010-01-13 09:16:55 +00008771 // FIXME: this currently happens when we're called from SemaInit
8772 // when user-conversion overload fails. Figure out how to handle
8773 // those conditions and diagnose them well.
8774 return S.NoteOverloadCandidate(Fn);
John McCall220ccbf2010-01-13 00:25:19 +00008775 }
Peter Collingbourne78dd67e2011-10-02 23:49:40 +00008776
8777 case ovl_fail_bad_target:
8778 return DiagnoseBadTarget(S, Cand);
John McCallb1bdc622010-02-25 01:37:24 +00008779 }
John McCalla1d7d622010-01-08 00:58:21 +00008780}
8781
8782void NoteSurrogateCandidate(Sema &S, OverloadCandidate *Cand) {
8783 // Desugar the type of the surrogate down to a function type,
8784 // retaining as many typedefs as possible while still showing
8785 // the function type (and, therefore, its parameter types).
8786 QualType FnType = Cand->Surrogate->getConversionType();
8787 bool isLValueReference = false;
8788 bool isRValueReference = false;
8789 bool isPointer = false;
8790 if (const LValueReferenceType *FnTypeRef =
8791 FnType->getAs<LValueReferenceType>()) {
8792 FnType = FnTypeRef->getPointeeType();
8793 isLValueReference = true;
8794 } else if (const RValueReferenceType *FnTypeRef =
8795 FnType->getAs<RValueReferenceType>()) {
8796 FnType = FnTypeRef->getPointeeType();
8797 isRValueReference = true;
8798 }
8799 if (const PointerType *FnTypePtr = FnType->getAs<PointerType>()) {
8800 FnType = FnTypePtr->getPointeeType();
8801 isPointer = true;
8802 }
8803 // Desugar down to a function type.
8804 FnType = QualType(FnType->getAs<FunctionType>(), 0);
8805 // Reconstruct the pointer/reference as appropriate.
8806 if (isPointer) FnType = S.Context.getPointerType(FnType);
8807 if (isRValueReference) FnType = S.Context.getRValueReferenceType(FnType);
8808 if (isLValueReference) FnType = S.Context.getLValueReferenceType(FnType);
8809
8810 S.Diag(Cand->Surrogate->getLocation(), diag::note_ovl_surrogate_cand)
8811 << FnType;
Sebastian Redlf677ea32011-02-05 19:23:19 +00008812 MaybeEmitInheritedConstructorNote(S, Cand->Surrogate);
John McCalla1d7d622010-01-08 00:58:21 +00008813}
8814
8815void NoteBuiltinOperatorCandidate(Sema &S,
David Blaikie0bea8632012-10-08 01:11:04 +00008816 StringRef Opc,
John McCalla1d7d622010-01-08 00:58:21 +00008817 SourceLocation OpLoc,
8818 OverloadCandidate *Cand) {
Benjamin Kramer09dd3792012-01-14 16:32:05 +00008819 assert(Cand->NumConversions <= 2 && "builtin operator is not binary");
John McCalla1d7d622010-01-08 00:58:21 +00008820 std::string TypeStr("operator");
8821 TypeStr += Opc;
8822 TypeStr += "(";
8823 TypeStr += Cand->BuiltinTypes.ParamTypes[0].getAsString();
Benjamin Kramer09dd3792012-01-14 16:32:05 +00008824 if (Cand->NumConversions == 1) {
John McCalla1d7d622010-01-08 00:58:21 +00008825 TypeStr += ")";
8826 S.Diag(OpLoc, diag::note_ovl_builtin_unary_candidate) << TypeStr;
8827 } else {
8828 TypeStr += ", ";
8829 TypeStr += Cand->BuiltinTypes.ParamTypes[1].getAsString();
8830 TypeStr += ")";
8831 S.Diag(OpLoc, diag::note_ovl_builtin_binary_candidate) << TypeStr;
8832 }
8833}
8834
8835void NoteAmbiguousUserConversions(Sema &S, SourceLocation OpLoc,
8836 OverloadCandidate *Cand) {
Benjamin Kramer09dd3792012-01-14 16:32:05 +00008837 unsigned NoOperands = Cand->NumConversions;
John McCalla1d7d622010-01-08 00:58:21 +00008838 for (unsigned ArgIdx = 0; ArgIdx < NoOperands; ++ArgIdx) {
8839 const ImplicitConversionSequence &ICS = Cand->Conversions[ArgIdx];
John McCall1d318332010-01-12 00:44:57 +00008840 if (ICS.isBad()) break; // all meaningless after first invalid
8841 if (!ICS.isAmbiguous()) continue;
8842
John McCall120d63c2010-08-24 20:38:10 +00008843 ICS.DiagnoseAmbiguousConversion(S, OpLoc,
Douglas Gregorfe6b2d42010-03-29 23:34:08 +00008844 S.PDiag(diag::note_ambiguous_type_conversion));
John McCalla1d7d622010-01-08 00:58:21 +00008845 }
8846}
8847
John McCall1b77e732010-01-15 23:32:50 +00008848SourceLocation GetLocationForCandidate(const OverloadCandidate *Cand) {
8849 if (Cand->Function)
8850 return Cand->Function->getLocation();
John McCallf3cf22b2010-01-16 03:50:16 +00008851 if (Cand->IsSurrogate)
John McCall1b77e732010-01-15 23:32:50 +00008852 return Cand->Surrogate->getLocation();
8853 return SourceLocation();
8854}
8855
Benjamin Kramerafc5b152011-09-10 21:52:04 +00008856static unsigned
8857RankDeductionFailure(const OverloadCandidate::DeductionFailureInfo &DFI) {
Chandler Carruth78bf6802011-09-10 00:51:24 +00008858 switch ((Sema::TemplateDeductionResult)DFI.Result) {
Kaelyn Uhrainfd641f92011-09-09 21:58:49 +00008859 case Sema::TDK_Success:
David Blaikieb219cfc2011-09-23 05:06:16 +00008860 llvm_unreachable("TDK_success while diagnosing bad deduction");
Benjamin Kramerafc5b152011-09-10 21:52:04 +00008861
Douglas Gregorae19fbb2012-09-13 21:01:57 +00008862 case Sema::TDK_Invalid:
Kaelyn Uhrainfd641f92011-09-09 21:58:49 +00008863 case Sema::TDK_Incomplete:
8864 return 1;
8865
8866 case Sema::TDK_Underqualified:
8867 case Sema::TDK_Inconsistent:
8868 return 2;
8869
8870 case Sema::TDK_SubstitutionFailure:
8871 case Sema::TDK_NonDeducedMismatch:
Richard Smith29805ca2013-01-31 05:19:49 +00008872 case Sema::TDK_MiscellaneousDeductionFailure:
Kaelyn Uhrainfd641f92011-09-09 21:58:49 +00008873 return 3;
8874
8875 case Sema::TDK_InstantiationDepth:
8876 case Sema::TDK_FailedOverloadResolution:
8877 return 4;
8878
8879 case Sema::TDK_InvalidExplicitArguments:
8880 return 5;
8881
8882 case Sema::TDK_TooManyArguments:
8883 case Sema::TDK_TooFewArguments:
8884 return 6;
8885 }
Benjamin Kramerafc5b152011-09-10 21:52:04 +00008886 llvm_unreachable("Unhandled deduction result");
Kaelyn Uhrainfd641f92011-09-09 21:58:49 +00008887}
8888
John McCallbf65c0b2010-01-12 00:48:53 +00008889struct CompareOverloadCandidatesForDisplay {
8890 Sema &S;
8891 CompareOverloadCandidatesForDisplay(Sema &S) : S(S) {}
John McCall81201622010-01-08 04:41:39 +00008892
8893 bool operator()(const OverloadCandidate *L,
8894 const OverloadCandidate *R) {
John McCallf3cf22b2010-01-16 03:50:16 +00008895 // Fast-path this check.
8896 if (L == R) return false;
8897
John McCall81201622010-01-08 04:41:39 +00008898 // Order first by viability.
John McCallbf65c0b2010-01-12 00:48:53 +00008899 if (L->Viable) {
8900 if (!R->Viable) return true;
8901
8902 // TODO: introduce a tri-valued comparison for overload
8903 // candidates. Would be more worthwhile if we had a sort
8904 // that could exploit it.
John McCall120d63c2010-08-24 20:38:10 +00008905 if (isBetterOverloadCandidate(S, *L, *R, SourceLocation())) return true;
8906 if (isBetterOverloadCandidate(S, *R, *L, SourceLocation())) return false;
John McCallbf65c0b2010-01-12 00:48:53 +00008907 } else if (R->Viable)
8908 return false;
John McCall81201622010-01-08 04:41:39 +00008909
John McCall1b77e732010-01-15 23:32:50 +00008910 assert(L->Viable == R->Viable);
John McCall81201622010-01-08 04:41:39 +00008911
John McCall1b77e732010-01-15 23:32:50 +00008912 // Criteria by which we can sort non-viable candidates:
8913 if (!L->Viable) {
8914 // 1. Arity mismatches come after other candidates.
8915 if (L->FailureKind == ovl_fail_too_many_arguments ||
8916 L->FailureKind == ovl_fail_too_few_arguments)
8917 return false;
8918 if (R->FailureKind == ovl_fail_too_many_arguments ||
8919 R->FailureKind == ovl_fail_too_few_arguments)
8920 return true;
John McCall81201622010-01-08 04:41:39 +00008921
John McCall717e8912010-01-23 05:17:32 +00008922 // 2. Bad conversions come first and are ordered by the number
8923 // of bad conversions and quality of good conversions.
8924 if (L->FailureKind == ovl_fail_bad_conversion) {
8925 if (R->FailureKind != ovl_fail_bad_conversion)
8926 return true;
8927
Anna Zaksb89fe6b2011-07-19 19:49:12 +00008928 // The conversion that can be fixed with a smaller number of changes,
8929 // comes first.
8930 unsigned numLFixes = L->Fix.NumConversionsFixed;
8931 unsigned numRFixes = R->Fix.NumConversionsFixed;
8932 numLFixes = (numLFixes == 0) ? UINT_MAX : numLFixes;
8933 numRFixes = (numRFixes == 0) ? UINT_MAX : numRFixes;
Anna Zaksffe9edd2011-07-21 00:34:39 +00008934 if (numLFixes != numRFixes) {
Anna Zaksb89fe6b2011-07-19 19:49:12 +00008935 if (numLFixes < numRFixes)
8936 return true;
8937 else
8938 return false;
Anna Zaksffe9edd2011-07-21 00:34:39 +00008939 }
Anna Zaksb89fe6b2011-07-19 19:49:12 +00008940
John McCall717e8912010-01-23 05:17:32 +00008941 // If there's any ordering between the defined conversions...
8942 // FIXME: this might not be transitive.
Benjamin Kramer09dd3792012-01-14 16:32:05 +00008943 assert(L->NumConversions == R->NumConversions);
John McCall717e8912010-01-23 05:17:32 +00008944
8945 int leftBetter = 0;
John McCall3a813372010-02-25 10:46:05 +00008946 unsigned I = (L->IgnoreObjectArgument || R->IgnoreObjectArgument);
Benjamin Kramer09dd3792012-01-14 16:32:05 +00008947 for (unsigned E = L->NumConversions; I != E; ++I) {
John McCall120d63c2010-08-24 20:38:10 +00008948 switch (CompareImplicitConversionSequences(S,
8949 L->Conversions[I],
8950 R->Conversions[I])) {
John McCall717e8912010-01-23 05:17:32 +00008951 case ImplicitConversionSequence::Better:
8952 leftBetter++;
8953 break;
8954
8955 case ImplicitConversionSequence::Worse:
8956 leftBetter--;
8957 break;
8958
8959 case ImplicitConversionSequence::Indistinguishable:
8960 break;
8961 }
8962 }
8963 if (leftBetter > 0) return true;
8964 if (leftBetter < 0) return false;
8965
8966 } else if (R->FailureKind == ovl_fail_bad_conversion)
8967 return false;
8968
Kaelyn Uhrainfd641f92011-09-09 21:58:49 +00008969 if (L->FailureKind == ovl_fail_bad_deduction) {
8970 if (R->FailureKind != ovl_fail_bad_deduction)
8971 return true;
8972
8973 if (L->DeductionFailure.Result != R->DeductionFailure.Result)
8974 return RankDeductionFailure(L->DeductionFailure)
Eli Friedmance1846e2011-10-14 23:10:30 +00008975 < RankDeductionFailure(R->DeductionFailure);
Eli Friedman1c522f72011-10-14 21:52:24 +00008976 } else if (R->FailureKind == ovl_fail_bad_deduction)
8977 return false;
Kaelyn Uhrainfd641f92011-09-09 21:58:49 +00008978
John McCall1b77e732010-01-15 23:32:50 +00008979 // TODO: others?
8980 }
8981
8982 // Sort everything else by location.
8983 SourceLocation LLoc = GetLocationForCandidate(L);
8984 SourceLocation RLoc = GetLocationForCandidate(R);
8985
8986 // Put candidates without locations (e.g. builtins) at the end.
8987 if (LLoc.isInvalid()) return false;
8988 if (RLoc.isInvalid()) return true;
8989
8990 return S.SourceMgr.isBeforeInTranslationUnit(LLoc, RLoc);
John McCall81201622010-01-08 04:41:39 +00008991 }
8992};
8993
John McCall717e8912010-01-23 05:17:32 +00008994/// CompleteNonViableCandidate - Normally, overload resolution only
Anna Zaksb89fe6b2011-07-19 19:49:12 +00008995/// computes up to the first. Produces the FixIt set if possible.
John McCall717e8912010-01-23 05:17:32 +00008996void CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00008997 ArrayRef<Expr *> Args) {
John McCall717e8912010-01-23 05:17:32 +00008998 assert(!Cand->Viable);
8999
9000 // Don't do anything on failures other than bad conversion.
9001 if (Cand->FailureKind != ovl_fail_bad_conversion) return;
9002
Anna Zaksb89fe6b2011-07-19 19:49:12 +00009003 // We only want the FixIts if all the arguments can be corrected.
9004 bool Unfixable = false;
Anna Zaksf3546ee2011-07-28 19:46:48 +00009005 // Use a implicit copy initialization to check conversion fixes.
9006 Cand->Fix.setConversionChecker(TryCopyInitialization);
Anna Zaksb89fe6b2011-07-19 19:49:12 +00009007
John McCall717e8912010-01-23 05:17:32 +00009008 // Skip forward to the first bad conversion.
John McCallb1bdc622010-02-25 01:37:24 +00009009 unsigned ConvIdx = (Cand->IgnoreObjectArgument ? 1 : 0);
Benjamin Kramer09dd3792012-01-14 16:32:05 +00009010 unsigned ConvCount = Cand->NumConversions;
John McCall717e8912010-01-23 05:17:32 +00009011 while (true) {
9012 assert(ConvIdx != ConvCount && "no bad conversion in candidate");
9013 ConvIdx++;
Anna Zaksb89fe6b2011-07-19 19:49:12 +00009014 if (Cand->Conversions[ConvIdx - 1].isBad()) {
Anna Zaksf3546ee2011-07-28 19:46:48 +00009015 Unfixable = !Cand->TryToFixBadConversion(ConvIdx - 1, S);
John McCall717e8912010-01-23 05:17:32 +00009016 break;
Anna Zaksb89fe6b2011-07-19 19:49:12 +00009017 }
John McCall717e8912010-01-23 05:17:32 +00009018 }
9019
9020 if (ConvIdx == ConvCount)
9021 return;
9022
John McCallb1bdc622010-02-25 01:37:24 +00009023 assert(!Cand->Conversions[ConvIdx].isInitialized() &&
9024 "remaining conversion is initialized?");
9025
Douglas Gregor23ef6c02010-04-16 17:45:54 +00009026 // FIXME: this should probably be preserved from the overload
John McCall717e8912010-01-23 05:17:32 +00009027 // operation somehow.
9028 bool SuppressUserConversions = false;
John McCall717e8912010-01-23 05:17:32 +00009029
9030 const FunctionProtoType* Proto;
9031 unsigned ArgIdx = ConvIdx;
9032
9033 if (Cand->IsSurrogate) {
9034 QualType ConvType
9035 = Cand->Surrogate->getConversionType().getNonReferenceType();
9036 if (const PointerType *ConvPtrType = ConvType->getAs<PointerType>())
9037 ConvType = ConvPtrType->getPointeeType();
9038 Proto = ConvType->getAs<FunctionProtoType>();
9039 ArgIdx--;
9040 } else if (Cand->Function) {
9041 Proto = Cand->Function->getType()->getAs<FunctionProtoType>();
9042 if (isa<CXXMethodDecl>(Cand->Function) &&
9043 !isa<CXXConstructorDecl>(Cand->Function))
9044 ArgIdx--;
9045 } else {
9046 // Builtin binary operator with a bad first conversion.
9047 assert(ConvCount <= 3);
9048 for (; ConvIdx != ConvCount; ++ConvIdx)
9049 Cand->Conversions[ConvIdx]
Douglas Gregor74eb6582010-04-16 17:51:22 +00009050 = TryCopyInitialization(S, Args[ConvIdx],
9051 Cand->BuiltinTypes.ParamTypes[ConvIdx],
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009052 SuppressUserConversions,
John McCallf85e1932011-06-15 23:02:42 +00009053 /*InOverloadResolution*/ true,
9054 /*AllowObjCWritebackConversion=*/
David Blaikie4e4d0842012-03-11 07:00:24 +00009055 S.getLangOpts().ObjCAutoRefCount);
John McCall717e8912010-01-23 05:17:32 +00009056 return;
9057 }
9058
9059 // Fill in the rest of the conversions.
9060 unsigned NumArgsInProto = Proto->getNumArgs();
9061 for (; ConvIdx != ConvCount; ++ConvIdx, ++ArgIdx) {
Anna Zaksb89fe6b2011-07-19 19:49:12 +00009062 if (ArgIdx < NumArgsInProto) {
John McCall717e8912010-01-23 05:17:32 +00009063 Cand->Conversions[ConvIdx]
Douglas Gregor74eb6582010-04-16 17:51:22 +00009064 = TryCopyInitialization(S, Args[ArgIdx], Proto->getArgType(ArgIdx),
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009065 SuppressUserConversions,
John McCallf85e1932011-06-15 23:02:42 +00009066 /*InOverloadResolution=*/true,
9067 /*AllowObjCWritebackConversion=*/
David Blaikie4e4d0842012-03-11 07:00:24 +00009068 S.getLangOpts().ObjCAutoRefCount);
Anna Zaksb89fe6b2011-07-19 19:49:12 +00009069 // Store the FixIt in the candidate if it exists.
9070 if (!Unfixable && Cand->Conversions[ConvIdx].isBad())
Anna Zaksf3546ee2011-07-28 19:46:48 +00009071 Unfixable = !Cand->TryToFixBadConversion(ConvIdx, S);
Anna Zaksb89fe6b2011-07-19 19:49:12 +00009072 }
John McCall717e8912010-01-23 05:17:32 +00009073 else
9074 Cand->Conversions[ConvIdx].setEllipsis();
9075 }
9076}
9077
John McCalla1d7d622010-01-08 00:58:21 +00009078} // end anonymous namespace
9079
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00009080/// PrintOverloadCandidates - When overload resolution fails, prints
9081/// diagnostic messages containing the candidates in the candidate
John McCall81201622010-01-08 04:41:39 +00009082/// set.
John McCall120d63c2010-08-24 20:38:10 +00009083void OverloadCandidateSet::NoteCandidates(Sema &S,
9084 OverloadCandidateDisplayKind OCD,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00009085 ArrayRef<Expr *> Args,
David Blaikie0bea8632012-10-08 01:11:04 +00009086 StringRef Opc,
John McCall120d63c2010-08-24 20:38:10 +00009087 SourceLocation OpLoc) {
John McCall81201622010-01-08 04:41:39 +00009088 // Sort the candidates by viability and position. Sorting directly would
9089 // be prohibitive, so we make a set of pointers and sort those.
Chris Lattner5f9e2722011-07-23 10:55:15 +00009090 SmallVector<OverloadCandidate*, 32> Cands;
John McCall120d63c2010-08-24 20:38:10 +00009091 if (OCD == OCD_AllCandidates) Cands.reserve(size());
9092 for (iterator Cand = begin(), LastCand = end(); Cand != LastCand; ++Cand) {
John McCall717e8912010-01-23 05:17:32 +00009093 if (Cand->Viable)
John McCall81201622010-01-08 04:41:39 +00009094 Cands.push_back(Cand);
John McCall717e8912010-01-23 05:17:32 +00009095 else if (OCD == OCD_AllCandidates) {
Ahmed Charles13a140c2012-02-25 11:00:22 +00009096 CompleteNonViableCandidate(S, Cand, Args);
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00009097 if (Cand->Function || Cand->IsSurrogate)
9098 Cands.push_back(Cand);
9099 // Otherwise, this a non-viable builtin candidate. We do not, in general,
9100 // want to list every possible builtin candidate.
John McCall717e8912010-01-23 05:17:32 +00009101 }
9102 }
9103
John McCallbf65c0b2010-01-12 00:48:53 +00009104 std::sort(Cands.begin(), Cands.end(),
John McCall120d63c2010-08-24 20:38:10 +00009105 CompareOverloadCandidatesForDisplay(S));
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009106
John McCall1d318332010-01-12 00:44:57 +00009107 bool ReportedAmbiguousConversions = false;
John McCalla1d7d622010-01-08 00:58:21 +00009108
Chris Lattner5f9e2722011-07-23 10:55:15 +00009109 SmallVectorImpl<OverloadCandidate*>::iterator I, E;
Douglas Gregordc7b6412012-10-23 23:11:23 +00009110 const OverloadsShown ShowOverloads = S.Diags.getShowOverloads();
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00009111 unsigned CandsShown = 0;
John McCall81201622010-01-08 04:41:39 +00009112 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
9113 OverloadCandidate *Cand = *I;
Douglas Gregor621b3932008-11-21 02:54:28 +00009114
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00009115 // Set an arbitrary limit on the number of candidate functions we'll spam
9116 // the user with. FIXME: This limit should depend on details of the
9117 // candidate list.
Douglas Gregordc7b6412012-10-23 23:11:23 +00009118 if (CandsShown >= 4 && ShowOverloads == Ovl_Best) {
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00009119 break;
9120 }
9121 ++CandsShown;
9122
John McCalla1d7d622010-01-08 00:58:21 +00009123 if (Cand->Function)
Ahmed Charles13a140c2012-02-25 11:00:22 +00009124 NoteFunctionCandidate(S, Cand, Args.size());
John McCalla1d7d622010-01-08 00:58:21 +00009125 else if (Cand->IsSurrogate)
John McCall120d63c2010-08-24 20:38:10 +00009126 NoteSurrogateCandidate(S, Cand);
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00009127 else {
9128 assert(Cand->Viable &&
9129 "Non-viable built-in candidates are not added to Cands.");
John McCall1d318332010-01-12 00:44:57 +00009130 // Generally we only see ambiguities including viable builtin
9131 // operators if overload resolution got screwed up by an
9132 // ambiguous user-defined conversion.
9133 //
9134 // FIXME: It's quite possible for different conversions to see
9135 // different ambiguities, though.
9136 if (!ReportedAmbiguousConversions) {
John McCall120d63c2010-08-24 20:38:10 +00009137 NoteAmbiguousUserConversions(S, OpLoc, Cand);
John McCall1d318332010-01-12 00:44:57 +00009138 ReportedAmbiguousConversions = true;
9139 }
John McCalla1d7d622010-01-08 00:58:21 +00009140
John McCall1d318332010-01-12 00:44:57 +00009141 // If this is a viable builtin, print it.
John McCall120d63c2010-08-24 20:38:10 +00009142 NoteBuiltinOperatorCandidate(S, Opc, OpLoc, Cand);
Douglas Gregoreb8f3062008-11-12 17:17:38 +00009143 }
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00009144 }
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00009145
9146 if (I != E)
John McCall120d63c2010-08-24 20:38:10 +00009147 S.Diag(OpLoc, diag::note_ovl_too_many_candidates) << int(E - I);
Douglas Gregor8e9bebd2008-10-21 16:13:35 +00009148}
9149
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009150// [PossiblyAFunctionType] --> [Return]
9151// NonFunctionType --> NonFunctionType
9152// R (A) --> R(A)
9153// R (*)(A) --> R (A)
9154// R (&)(A) --> R (A)
9155// R (S::*)(A) --> R (A)
9156QualType Sema::ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType) {
9157 QualType Ret = PossiblyAFunctionType;
9158 if (const PointerType *ToTypePtr =
9159 PossiblyAFunctionType->getAs<PointerType>())
9160 Ret = ToTypePtr->getPointeeType();
9161 else if (const ReferenceType *ToTypeRef =
9162 PossiblyAFunctionType->getAs<ReferenceType>())
9163 Ret = ToTypeRef->getPointeeType();
Sebastian Redl33b399a2009-02-04 21:23:32 +00009164 else if (const MemberPointerType *MemTypePtr =
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009165 PossiblyAFunctionType->getAs<MemberPointerType>())
9166 Ret = MemTypePtr->getPointeeType();
9167 Ret =
9168 Context.getCanonicalType(Ret).getUnqualifiedType();
9169 return Ret;
9170}
Douglas Gregor904eed32008-11-10 20:40:00 +00009171
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009172// A helper class to help with address of function resolution
9173// - allows us to avoid passing around all those ugly parameters
9174class AddressOfFunctionResolver
9175{
9176 Sema& S;
9177 Expr* SourceExpr;
9178 const QualType& TargetType;
9179 QualType TargetFunctionType; // Extracted function type from target type
9180
9181 bool Complain;
9182 //DeclAccessPair& ResultFunctionAccessPair;
9183 ASTContext& Context;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009184
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009185 bool TargetTypeIsNonStaticMemberFunction;
9186 bool FoundNonTemplateFunction;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009187
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009188 OverloadExpr::FindResult OvlExprInfo;
9189 OverloadExpr *OvlExpr;
9190 TemplateArgumentListInfo OvlExplicitTemplateArgs;
Chris Lattner5f9e2722011-07-23 10:55:15 +00009191 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009192
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009193public:
9194 AddressOfFunctionResolver(Sema &S, Expr* SourceExpr,
9195 const QualType& TargetType, bool Complain)
9196 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
9197 Complain(Complain), Context(S.getASTContext()),
9198 TargetTypeIsNonStaticMemberFunction(
9199 !!TargetType->getAs<MemberPointerType>()),
9200 FoundNonTemplateFunction(false),
9201 OvlExprInfo(OverloadExpr::find(SourceExpr)),
9202 OvlExpr(OvlExprInfo.Expression)
9203 {
9204 ExtractUnqualifiedFunctionTypeFromTargetType();
9205
9206 if (!TargetFunctionType->isFunctionType()) {
9207 if (OvlExpr->hasExplicitTemplateArgs()) {
9208 DeclAccessPair dap;
John McCall864c0412011-04-26 20:42:42 +00009209 if (FunctionDecl* Fn = S.ResolveSingleFunctionTemplateSpecialization(
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009210 OvlExpr, false, &dap) ) {
Chandler Carruth90434232011-03-29 08:08:18 +00009211
9212 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Fn)) {
9213 if (!Method->isStatic()) {
9214 // If the target type is a non-function type and the function
9215 // found is a non-static member function, pretend as if that was
9216 // the target, it's the only possible type to end up with.
9217 TargetTypeIsNonStaticMemberFunction = true;
9218
9219 // And skip adding the function if its not in the proper form.
9220 // We'll diagnose this due to an empty set of functions.
9221 if (!OvlExprInfo.HasFormOfMemberPointer)
9222 return;
9223 }
9224 }
9225
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009226 Matches.push_back(std::make_pair(dap,Fn));
9227 }
Douglas Gregor83314aa2009-07-08 20:55:45 +00009228 }
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009229 return;
Douglas Gregor83314aa2009-07-08 20:55:45 +00009230 }
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009231
9232 if (OvlExpr->hasExplicitTemplateArgs())
9233 OvlExpr->getExplicitTemplateArgs().copyInto(OvlExplicitTemplateArgs);
Mike Stump1eb44332009-09-09 15:08:12 +00009234
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009235 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
9236 // C++ [over.over]p4:
9237 // If more than one function is selected, [...]
9238 if (Matches.size() > 1) {
9239 if (FoundNonTemplateFunction)
9240 EliminateAllTemplateMatches();
9241 else
9242 EliminateAllExceptMostSpecializedTemplate();
9243 }
9244 }
9245 }
9246
9247private:
9248 bool isTargetTypeAFunction() const {
9249 return TargetFunctionType->isFunctionType();
9250 }
9251
9252 // [ToType] [Return]
9253
9254 // R (*)(A) --> R (A), IsNonStaticMemberFunction = false
9255 // R (&)(A) --> R (A), IsNonStaticMemberFunction = false
9256 // R (S::*)(A) --> R (A), IsNonStaticMemberFunction = true
9257 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
9258 TargetFunctionType = S.ExtractUnqualifiedFunctionType(TargetType);
9259 }
9260
9261 // return true if any matching specializations were found
9262 bool AddMatchingTemplateFunction(FunctionTemplateDecl* FunctionTemplate,
9263 const DeclAccessPair& CurAccessFunPair) {
9264 if (CXXMethodDecl *Method
9265 = dyn_cast<CXXMethodDecl>(FunctionTemplate->getTemplatedDecl())) {
9266 // Skip non-static function templates when converting to pointer, and
9267 // static when converting to member pointer.
9268 if (Method->isStatic() == TargetTypeIsNonStaticMemberFunction)
9269 return false;
9270 }
9271 else if (TargetTypeIsNonStaticMemberFunction)
9272 return false;
9273
9274 // C++ [over.over]p2:
9275 // If the name is a function template, template argument deduction is
9276 // done (14.8.2.2), and if the argument deduction succeeds, the
9277 // resulting template argument list is used to generate a single
9278 // function template specialization, which is added to the set of
9279 // overloaded functions considered.
9280 FunctionDecl *Specialization = 0;
Craig Topper93e45992012-09-19 02:26:47 +00009281 TemplateDeductionInfo Info(OvlExpr->getNameLoc());
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009282 if (Sema::TemplateDeductionResult Result
9283 = S.DeduceTemplateArguments(FunctionTemplate,
9284 &OvlExplicitTemplateArgs,
9285 TargetFunctionType, Specialization,
Douglas Gregor092140a2013-04-17 08:45:07 +00009286 Info, /*InOverloadResolution=*/true)) {
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009287 // FIXME: make a note of the failed deduction for diagnostics.
9288 (void)Result;
9289 return false;
9290 }
9291
Douglas Gregor092140a2013-04-17 08:45:07 +00009292 // Template argument deduction ensures that we have an exact match or
9293 // compatible pointer-to-function arguments that would be adjusted by ICS.
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009294 // This function template specicalization works.
9295 Specialization = cast<FunctionDecl>(Specialization->getCanonicalDecl());
Douglas Gregor092140a2013-04-17 08:45:07 +00009296 assert(S.isSameOrCompatibleFunctionType(
9297 Context.getCanonicalType(Specialization->getType()),
9298 Context.getCanonicalType(TargetFunctionType)));
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009299 Matches.push_back(std::make_pair(CurAccessFunPair, Specialization));
9300 return true;
9301 }
9302
9303 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
9304 const DeclAccessPair& CurAccessFunPair) {
Chandler Carruthbd647292009-12-29 06:17:27 +00009305 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Fn)) {
Sebastian Redl33b399a2009-02-04 21:23:32 +00009306 // Skip non-static functions when converting to pointer, and static
9307 // when converting to member pointer.
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009308 if (Method->isStatic() == TargetTypeIsNonStaticMemberFunction)
9309 return false;
9310 }
9311 else if (TargetTypeIsNonStaticMemberFunction)
9312 return false;
Douglas Gregor904eed32008-11-10 20:40:00 +00009313
Chandler Carruthbd647292009-12-29 06:17:27 +00009314 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
David Blaikie4e4d0842012-03-11 07:00:24 +00009315 if (S.getLangOpts().CUDA)
Peter Collingbourne78dd67e2011-10-02 23:49:40 +00009316 if (FunctionDecl *Caller = dyn_cast<FunctionDecl>(S.CurContext))
9317 if (S.CheckCUDATarget(Caller, FunDecl))
9318 return false;
9319
Richard Smith60e141e2013-05-04 07:00:32 +00009320 // If any candidate has a placeholder return type, trigger its deduction
9321 // now.
9322 if (S.getLangOpts().CPlusPlus1y &&
9323 FunDecl->getResultType()->isUndeducedType() &&
9324 S.DeduceReturnType(FunDecl, SourceExpr->getLocStart(), Complain))
9325 return false;
9326
Douglas Gregor43c79c22009-12-09 00:47:37 +00009327 QualType ResultTy;
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009328 if (Context.hasSameUnqualifiedType(TargetFunctionType,
9329 FunDecl->getType()) ||
Chandler Carruth18e04612011-06-18 01:19:03 +00009330 S.IsNoReturnConversion(FunDecl->getType(), TargetFunctionType,
9331 ResultTy)) {
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009332 Matches.push_back(std::make_pair(CurAccessFunPair,
9333 cast<FunctionDecl>(FunDecl->getCanonicalDecl())));
Douglas Gregor00aeb522009-07-08 23:33:52 +00009334 FoundNonTemplateFunction = true;
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009335 return true;
Douglas Gregor00aeb522009-07-08 23:33:52 +00009336 }
Mike Stump1eb44332009-09-09 15:08:12 +00009337 }
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009338
9339 return false;
9340 }
9341
9342 bool FindAllFunctionsThatMatchTargetTypeExactly() {
9343 bool Ret = false;
9344
9345 // If the overload expression doesn't have the form of a pointer to
9346 // member, don't try to convert it to a pointer-to-member type.
9347 if (IsInvalidFormOfPointerToMemberFunction())
9348 return false;
9349
9350 for (UnresolvedSetIterator I = OvlExpr->decls_begin(),
9351 E = OvlExpr->decls_end();
9352 I != E; ++I) {
9353 // Look through any using declarations to find the underlying function.
9354 NamedDecl *Fn = (*I)->getUnderlyingDecl();
9355
9356 // C++ [over.over]p3:
9357 // Non-member functions and static member functions match
9358 // targets of type "pointer-to-function" or "reference-to-function."
9359 // Nonstatic member functions match targets of
9360 // type "pointer-to-member-function."
9361 // Note that according to DR 247, the containing class does not matter.
9362 if (FunctionTemplateDecl *FunctionTemplate
9363 = dyn_cast<FunctionTemplateDecl>(Fn)) {
9364 if (AddMatchingTemplateFunction(FunctionTemplate, I.getPair()))
9365 Ret = true;
9366 }
9367 // If we have explicit template arguments supplied, skip non-templates.
9368 else if (!OvlExpr->hasExplicitTemplateArgs() &&
9369 AddMatchingNonTemplateFunction(Fn, I.getPair()))
9370 Ret = true;
9371 }
9372 assert(Ret || Matches.empty());
9373 return Ret;
Douglas Gregor904eed32008-11-10 20:40:00 +00009374 }
9375
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009376 void EliminateAllExceptMostSpecializedTemplate() {
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00009377 // [...] and any given function template specialization F1 is
9378 // eliminated if the set contains a second function template
9379 // specialization whose function template is more specialized
9380 // than the function template of F1 according to the partial
9381 // ordering rules of 14.5.5.2.
9382
9383 // The algorithm specified above is quadratic. We instead use a
9384 // two-pass algorithm (similar to the one used to identify the
9385 // best viable function in an overload set) that identifies the
9386 // best function template (if it exists).
John McCall9aa472c2010-03-19 07:35:19 +00009387
9388 UnresolvedSet<4> MatchesCopy; // TODO: avoid!
9389 for (unsigned I = 0, E = Matches.size(); I != E; ++I)
9390 MatchesCopy.addDecl(Matches[I].second, Matches[I].first.getAccess());
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009391
John McCallc373d482010-01-27 01:50:18 +00009392 UnresolvedSetIterator Result =
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009393 S.getMostSpecialized(MatchesCopy.begin(), MatchesCopy.end(),
9394 TPOC_Other, 0, SourceExpr->getLocStart(),
9395 S.PDiag(),
9396 S.PDiag(diag::err_addr_ovl_ambiguous)
9397 << Matches[0].second->getDeclName(),
9398 S.PDiag(diag::note_ovl_candidate)
9399 << (unsigned) oc_function_template,
Richard Trieu6efd4c52011-11-23 22:32:32 +00009400 Complain, TargetFunctionType);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009401
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009402 if (Result != MatchesCopy.end()) {
9403 // Make it the first and only element
9404 Matches[0].first = Matches[Result - MatchesCopy.begin()].first;
9405 Matches[0].second = cast<FunctionDecl>(*Result);
9406 Matches.resize(1);
John McCallc373d482010-01-27 01:50:18 +00009407 }
9408 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009409
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009410 void EliminateAllTemplateMatches() {
9411 // [...] any function template specializations in the set are
9412 // eliminated if the set also contains a non-template function, [...]
9413 for (unsigned I = 0, N = Matches.size(); I != N; ) {
9414 if (Matches[I].second->getPrimaryTemplate() == 0)
9415 ++I;
9416 else {
9417 Matches[I] = Matches[--N];
9418 Matches.set_size(N);
9419 }
9420 }
9421 }
9422
9423public:
9424 void ComplainNoMatchesFound() const {
9425 assert(Matches.empty());
9426 S.Diag(OvlExpr->getLocStart(), diag::err_addr_ovl_no_viable)
9427 << OvlExpr->getName() << TargetFunctionType
9428 << OvlExpr->getSourceRange();
Richard Trieu6efd4c52011-11-23 22:32:32 +00009429 S.NoteAllOverloadCandidates(OvlExpr, TargetFunctionType);
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009430 }
9431
9432 bool IsInvalidFormOfPointerToMemberFunction() const {
9433 return TargetTypeIsNonStaticMemberFunction &&
9434 !OvlExprInfo.HasFormOfMemberPointer;
9435 }
9436
9437 void ComplainIsInvalidFormOfPointerToMemberFunction() const {
9438 // TODO: Should we condition this on whether any functions might
9439 // have matched, or is it more appropriate to do that in callers?
9440 // TODO: a fixit wouldn't hurt.
9441 S.Diag(OvlExpr->getNameLoc(), diag::err_addr_ovl_no_qualifier)
9442 << TargetType << OvlExpr->getSourceRange();
9443 }
9444
9445 void ComplainOfInvalidConversion() const {
9446 S.Diag(OvlExpr->getLocStart(), diag::err_addr_ovl_not_func_ptrref)
9447 << OvlExpr->getName() << TargetType;
9448 }
9449
9450 void ComplainMultipleMatchesFound() const {
9451 assert(Matches.size() > 1);
9452 S.Diag(OvlExpr->getLocStart(), diag::err_addr_ovl_ambiguous)
9453 << OvlExpr->getName()
9454 << OvlExpr->getSourceRange();
Richard Trieu6efd4c52011-11-23 22:32:32 +00009455 S.NoteAllOverloadCandidates(OvlExpr, TargetFunctionType);
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009456 }
Abramo Bagnara22c107b2011-11-19 11:44:21 +00009457
9458 bool hadMultipleCandidates() const { return (OvlExpr->getNumDecls() > 1); }
9459
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009460 int getNumMatches() const { return Matches.size(); }
9461
9462 FunctionDecl* getMatchingFunctionDecl() const {
9463 if (Matches.size() != 1) return 0;
9464 return Matches[0].second;
9465 }
9466
9467 const DeclAccessPair* getMatchingFunctionAccessPair() const {
9468 if (Matches.size() != 1) return 0;
9469 return &Matches[0].first;
9470 }
9471};
9472
9473/// ResolveAddressOfOverloadedFunction - Try to resolve the address of
9474/// an overloaded function (C++ [over.over]), where @p From is an
9475/// expression with overloaded function type and @p ToType is the type
9476/// we're trying to resolve to. For example:
9477///
9478/// @code
9479/// int f(double);
9480/// int f(int);
9481///
9482/// int (*pfd)(double) = f; // selects f(double)
9483/// @endcode
9484///
9485/// This routine returns the resulting FunctionDecl if it could be
9486/// resolved, and NULL otherwise. When @p Complain is true, this
9487/// routine will emit diagnostics if there is an error.
9488FunctionDecl *
Abramo Bagnara22c107b2011-11-19 11:44:21 +00009489Sema::ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr,
9490 QualType TargetType,
9491 bool Complain,
9492 DeclAccessPair &FoundResult,
9493 bool *pHadMultipleCandidates) {
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009494 assert(AddressOfExpr->getType() == Context.OverloadTy);
Abramo Bagnara22c107b2011-11-19 11:44:21 +00009495
9496 AddressOfFunctionResolver Resolver(*this, AddressOfExpr, TargetType,
9497 Complain);
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009498 int NumMatches = Resolver.getNumMatches();
9499 FunctionDecl* Fn = 0;
Abramo Bagnara22c107b2011-11-19 11:44:21 +00009500 if (NumMatches == 0 && Complain) {
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009501 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
9502 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
9503 else
9504 Resolver.ComplainNoMatchesFound();
9505 }
9506 else if (NumMatches > 1 && Complain)
9507 Resolver.ComplainMultipleMatchesFound();
9508 else if (NumMatches == 1) {
9509 Fn = Resolver.getMatchingFunctionDecl();
9510 assert(Fn);
9511 FoundResult = *Resolver.getMatchingFunctionAccessPair();
Douglas Gregor9b623632010-10-12 23:32:35 +00009512 if (Complain)
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009513 CheckAddressOfMemberAccess(AddressOfExpr, FoundResult);
Sebastian Redl07ab2022009-10-17 21:12:09 +00009514 }
Abramo Bagnara22c107b2011-11-19 11:44:21 +00009515
9516 if (pHadMultipleCandidates)
9517 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009518 return Fn;
Douglas Gregor904eed32008-11-10 20:40:00 +00009519}
9520
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009521/// \brief Given an expression that refers to an overloaded function, try to
Douglas Gregor4b52e252009-12-21 23:17:24 +00009522/// resolve that overloaded function expression down to a single function.
9523///
9524/// This routine can only resolve template-ids that refer to a single function
9525/// template, where that template-id refers to a single template whose template
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009526/// arguments are either provided by the template-id or have defaults,
Douglas Gregor4b52e252009-12-21 23:17:24 +00009527/// as described in C++0x [temp.arg.explicit]p3.
John McCall864c0412011-04-26 20:42:42 +00009528FunctionDecl *
9529Sema::ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl,
9530 bool Complain,
9531 DeclAccessPair *FoundResult) {
Douglas Gregor4b52e252009-12-21 23:17:24 +00009532 // C++ [over.over]p1:
9533 // [...] [Note: any redundant set of parentheses surrounding the
9534 // overloaded function name is ignored (5.1). ]
Douglas Gregor4b52e252009-12-21 23:17:24 +00009535 // C++ [over.over]p1:
9536 // [...] The overloaded function name can be preceded by the &
9537 // operator.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009538
Douglas Gregor4b52e252009-12-21 23:17:24 +00009539 // If we didn't actually find any template-ids, we're done.
John McCall864c0412011-04-26 20:42:42 +00009540 if (!ovl->hasExplicitTemplateArgs())
Douglas Gregor4b52e252009-12-21 23:17:24 +00009541 return 0;
John McCall7bb12da2010-02-02 06:20:04 +00009542
9543 TemplateArgumentListInfo ExplicitTemplateArgs;
John McCall864c0412011-04-26 20:42:42 +00009544 ovl->getExplicitTemplateArgs().copyInto(ExplicitTemplateArgs);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009545
Douglas Gregor4b52e252009-12-21 23:17:24 +00009546 // Look through all of the overloaded functions, searching for one
9547 // whose type matches exactly.
9548 FunctionDecl *Matched = 0;
John McCall864c0412011-04-26 20:42:42 +00009549 for (UnresolvedSetIterator I = ovl->decls_begin(),
9550 E = ovl->decls_end(); I != E; ++I) {
Douglas Gregor4b52e252009-12-21 23:17:24 +00009551 // C++0x [temp.arg.explicit]p3:
9552 // [...] In contexts where deduction is done and fails, or in contexts
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009553 // where deduction is not done, if a template argument list is
9554 // specified and it, along with any default template arguments,
9555 // identifies a single function template specialization, then the
Douglas Gregor4b52e252009-12-21 23:17:24 +00009556 // template-id is an lvalue for the function template specialization.
Douglas Gregor66a8c9a2010-07-14 23:20:53 +00009557 FunctionTemplateDecl *FunctionTemplate
9558 = cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009559
Douglas Gregor4b52e252009-12-21 23:17:24 +00009560 // C++ [over.over]p2:
9561 // If the name is a function template, template argument deduction is
9562 // done (14.8.2.2), and if the argument deduction succeeds, the
9563 // resulting template argument list is used to generate a single
9564 // function template specialization, which is added to the set of
9565 // overloaded functions considered.
Douglas Gregor4b52e252009-12-21 23:17:24 +00009566 FunctionDecl *Specialization = 0;
Craig Topper93e45992012-09-19 02:26:47 +00009567 TemplateDeductionInfo Info(ovl->getNameLoc());
Douglas Gregor4b52e252009-12-21 23:17:24 +00009568 if (TemplateDeductionResult Result
9569 = DeduceTemplateArguments(FunctionTemplate, &ExplicitTemplateArgs,
Douglas Gregor092140a2013-04-17 08:45:07 +00009570 Specialization, Info,
9571 /*InOverloadResolution=*/true)) {
Douglas Gregor4b52e252009-12-21 23:17:24 +00009572 // FIXME: make a note of the failed deduction for diagnostics.
9573 (void)Result;
9574 continue;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009575 }
9576
John McCall864c0412011-04-26 20:42:42 +00009577 assert(Specialization && "no specialization and no error?");
9578
Douglas Gregor4b52e252009-12-21 23:17:24 +00009579 // Multiple matches; we can't resolve to a single declaration.
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009580 if (Matched) {
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009581 if (Complain) {
John McCall864c0412011-04-26 20:42:42 +00009582 Diag(ovl->getExprLoc(), diag::err_addr_ovl_ambiguous)
9583 << ovl->getName();
9584 NoteAllOverloadCandidates(ovl);
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009585 }
Douglas Gregor4b52e252009-12-21 23:17:24 +00009586 return 0;
John McCall864c0412011-04-26 20:42:42 +00009587 }
Douglas Gregor1be8eec2011-02-19 21:32:49 +00009588
John McCall864c0412011-04-26 20:42:42 +00009589 Matched = Specialization;
9590 if (FoundResult) *FoundResult = I.getPair();
Douglas Gregor4b52e252009-12-21 23:17:24 +00009591 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009592
Richard Smith60e141e2013-05-04 07:00:32 +00009593 if (Matched && getLangOpts().CPlusPlus1y &&
9594 Matched->getResultType()->isUndeducedType() &&
9595 DeduceReturnType(Matched, ovl->getExprLoc(), Complain))
9596 return 0;
9597
Douglas Gregor4b52e252009-12-21 23:17:24 +00009598 return Matched;
9599}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009600
Douglas Gregorfadb53b2011-03-12 01:48:56 +00009601
9602
9603
John McCall6dbba4f2011-10-11 23:14:30 +00009604// Resolve and fix an overloaded expression that can be resolved
9605// because it identifies a single function template specialization.
9606//
Douglas Gregorfadb53b2011-03-12 01:48:56 +00009607// Last three arguments should only be supplied if Complain = true
John McCall6dbba4f2011-10-11 23:14:30 +00009608//
9609// Return true if it was logically possible to so resolve the
9610// expression, regardless of whether or not it succeeded. Always
9611// returns true if 'complain' is set.
9612bool Sema::ResolveAndFixSingleFunctionTemplateSpecialization(
9613 ExprResult &SrcExpr, bool doFunctionPointerConverion,
9614 bool complain, const SourceRange& OpRangeForComplaining,
Douglas Gregorfadb53b2011-03-12 01:48:56 +00009615 QualType DestTypeForComplaining,
John McCall864c0412011-04-26 20:42:42 +00009616 unsigned DiagIDForComplaining) {
John McCall6dbba4f2011-10-11 23:14:30 +00009617 assert(SrcExpr.get()->getType() == Context.OverloadTy);
Douglas Gregorfadb53b2011-03-12 01:48:56 +00009618
John McCall6dbba4f2011-10-11 23:14:30 +00009619 OverloadExpr::FindResult ovl = OverloadExpr::find(SrcExpr.get());
Douglas Gregorfadb53b2011-03-12 01:48:56 +00009620
John McCall864c0412011-04-26 20:42:42 +00009621 DeclAccessPair found;
9622 ExprResult SingleFunctionExpression;
9623 if (FunctionDecl *fn = ResolveSingleFunctionTemplateSpecialization(
9624 ovl.Expression, /*complain*/ false, &found)) {
Daniel Dunbar96a00142012-03-09 18:35:03 +00009625 if (DiagnoseUseOfDecl(fn, SrcExpr.get()->getLocStart())) {
John McCall6dbba4f2011-10-11 23:14:30 +00009626 SrcExpr = ExprError();
9627 return true;
9628 }
John McCall864c0412011-04-26 20:42:42 +00009629
9630 // It is only correct to resolve to an instance method if we're
9631 // resolving a form that's permitted to be a pointer to member.
9632 // Otherwise we'll end up making a bound member expression, which
9633 // is illegal in all the contexts we resolve like this.
9634 if (!ovl.HasFormOfMemberPointer &&
9635 isa<CXXMethodDecl>(fn) &&
9636 cast<CXXMethodDecl>(fn)->isInstance()) {
John McCall6dbba4f2011-10-11 23:14:30 +00009637 if (!complain) return false;
9638
9639 Diag(ovl.Expression->getExprLoc(),
9640 diag::err_bound_member_function)
9641 << 0 << ovl.Expression->getSourceRange();
9642
9643 // TODO: I believe we only end up here if there's a mix of
9644 // static and non-static candidates (otherwise the expression
9645 // would have 'bound member' type, not 'overload' type).
9646 // Ideally we would note which candidate was chosen and why
9647 // the static candidates were rejected.
9648 SrcExpr = ExprError();
9649 return true;
Douglas Gregorfadb53b2011-03-12 01:48:56 +00009650 }
Douglas Gregordb2eae62011-03-16 19:16:25 +00009651
Sylvestre Ledru43e3dee2012-07-31 06:56:50 +00009652 // Fix the expression to refer to 'fn'.
John McCall864c0412011-04-26 20:42:42 +00009653 SingleFunctionExpression =
John McCall6dbba4f2011-10-11 23:14:30 +00009654 Owned(FixOverloadedFunctionReference(SrcExpr.take(), found, fn));
John McCall864c0412011-04-26 20:42:42 +00009655
9656 // If desired, do function-to-pointer decay.
John McCall6dbba4f2011-10-11 23:14:30 +00009657 if (doFunctionPointerConverion) {
John McCall864c0412011-04-26 20:42:42 +00009658 SingleFunctionExpression =
9659 DefaultFunctionArrayLvalueConversion(SingleFunctionExpression.take());
John McCall6dbba4f2011-10-11 23:14:30 +00009660 if (SingleFunctionExpression.isInvalid()) {
9661 SrcExpr = ExprError();
9662 return true;
9663 }
9664 }
John McCall864c0412011-04-26 20:42:42 +00009665 }
9666
9667 if (!SingleFunctionExpression.isUsable()) {
9668 if (complain) {
9669 Diag(OpRangeForComplaining.getBegin(), DiagIDForComplaining)
9670 << ovl.Expression->getName()
9671 << DestTypeForComplaining
9672 << OpRangeForComplaining
9673 << ovl.Expression->getQualifierLoc().getSourceRange();
John McCall6dbba4f2011-10-11 23:14:30 +00009674 NoteAllOverloadCandidates(SrcExpr.get());
9675
9676 SrcExpr = ExprError();
9677 return true;
9678 }
9679
9680 return false;
John McCall864c0412011-04-26 20:42:42 +00009681 }
9682
John McCall6dbba4f2011-10-11 23:14:30 +00009683 SrcExpr = SingleFunctionExpression;
9684 return true;
Douglas Gregorfadb53b2011-03-12 01:48:56 +00009685}
9686
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009687/// \brief Add a single candidate to the overload set.
9688static void AddOverloadedCallCandidate(Sema &S,
John McCall9aa472c2010-03-19 07:35:19 +00009689 DeclAccessPair FoundDecl,
Douglas Gregor67714232011-03-03 02:41:12 +00009690 TemplateArgumentListInfo *ExplicitTemplateArgs,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00009691 ArrayRef<Expr *> Args,
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009692 OverloadCandidateSet &CandidateSet,
Richard Smith2ced0442011-06-26 22:19:54 +00009693 bool PartialOverloading,
9694 bool KnownValid) {
John McCall9aa472c2010-03-19 07:35:19 +00009695 NamedDecl *Callee = FoundDecl.getDecl();
John McCallba135432009-11-21 08:51:07 +00009696 if (isa<UsingShadowDecl>(Callee))
9697 Callee = cast<UsingShadowDecl>(Callee)->getTargetDecl();
9698
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009699 if (FunctionDecl *Func = dyn_cast<FunctionDecl>(Callee)) {
Richard Smith2ced0442011-06-26 22:19:54 +00009700 if (ExplicitTemplateArgs) {
9701 assert(!KnownValid && "Explicit template arguments?");
9702 return;
9703 }
Ahmed Charles13a140c2012-02-25 11:00:22 +00009704 S.AddOverloadCandidate(Func, FoundDecl, Args, CandidateSet, false,
9705 PartialOverloading);
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009706 return;
John McCallba135432009-11-21 08:51:07 +00009707 }
9708
9709 if (FunctionTemplateDecl *FuncTemplate
9710 = dyn_cast<FunctionTemplateDecl>(Callee)) {
John McCall9aa472c2010-03-19 07:35:19 +00009711 S.AddTemplateOverloadCandidate(FuncTemplate, FoundDecl,
Ahmed Charles13a140c2012-02-25 11:00:22 +00009712 ExplicitTemplateArgs, Args, CandidateSet);
John McCallba135432009-11-21 08:51:07 +00009713 return;
9714 }
9715
Richard Smith2ced0442011-06-26 22:19:54 +00009716 assert(!KnownValid && "unhandled case in overloaded call candidate");
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009717}
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +00009718
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009719/// \brief Add the overload candidates named by callee and/or found by argument
9720/// dependent lookup to the given overload set.
John McCall3b4294e2009-12-16 12:17:52 +00009721void Sema::AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00009722 ArrayRef<Expr *> Args,
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009723 OverloadCandidateSet &CandidateSet,
9724 bool PartialOverloading) {
John McCallba135432009-11-21 08:51:07 +00009725
9726#ifndef NDEBUG
9727 // Verify that ArgumentDependentLookup is consistent with the rules
9728 // in C++0x [basic.lookup.argdep]p3:
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009729 //
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009730 // Let X be the lookup set produced by unqualified lookup (3.4.1)
9731 // and let Y be the lookup set produced by argument dependent
9732 // lookup (defined as follows). If X contains
9733 //
9734 // -- a declaration of a class member, or
9735 //
9736 // -- a block-scope function declaration that is not a
John McCallba135432009-11-21 08:51:07 +00009737 // using-declaration, or
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009738 //
9739 // -- a declaration that is neither a function or a function
9740 // template
9741 //
9742 // then Y is empty.
John McCallba135432009-11-21 08:51:07 +00009743
John McCall3b4294e2009-12-16 12:17:52 +00009744 if (ULE->requiresADL()) {
9745 for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(),
9746 E = ULE->decls_end(); I != E; ++I) {
9747 assert(!(*I)->getDeclContext()->isRecord());
9748 assert(isa<UsingShadowDecl>(*I) ||
9749 !(*I)->getDeclContext()->isFunctionOrMethod());
9750 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
John McCallba135432009-11-21 08:51:07 +00009751 }
9752 }
9753#endif
9754
John McCall3b4294e2009-12-16 12:17:52 +00009755 // It would be nice to avoid this copy.
9756 TemplateArgumentListInfo TABuffer;
Douglas Gregor67714232011-03-03 02:41:12 +00009757 TemplateArgumentListInfo *ExplicitTemplateArgs = 0;
John McCall3b4294e2009-12-16 12:17:52 +00009758 if (ULE->hasExplicitTemplateArgs()) {
9759 ULE->copyTemplateArgumentsInto(TABuffer);
9760 ExplicitTemplateArgs = &TABuffer;
9761 }
9762
9763 for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(),
9764 E = ULE->decls_end(); I != E; ++I)
Ahmed Charles13a140c2012-02-25 11:00:22 +00009765 AddOverloadedCallCandidate(*this, I.getPair(), ExplicitTemplateArgs, Args,
9766 CandidateSet, PartialOverloading,
9767 /*KnownValid*/ true);
John McCallba135432009-11-21 08:51:07 +00009768
John McCall3b4294e2009-12-16 12:17:52 +00009769 if (ULE->requiresADL())
John McCall6e266892010-01-26 03:27:55 +00009770 AddArgumentDependentLookupCandidates(ULE->getName(), /*Operator*/ false,
Richard Smithf5cd5cc2012-02-25 06:24:24 +00009771 ULE->getExprLoc(),
Ahmed Charles13a140c2012-02-25 11:00:22 +00009772 Args, ExplicitTemplateArgs,
Richard Smithb1502bc2012-10-18 17:56:02 +00009773 CandidateSet, PartialOverloading);
Douglas Gregor9c6a0e92009-09-22 15:41:20 +00009774}
John McCall578b69b2009-12-16 08:11:27 +00009775
Richard Smithd3ff3252013-06-12 22:56:54 +00009776/// Determine whether a declaration with the specified name could be moved into
9777/// a different namespace.
9778static bool canBeDeclaredInNamespace(const DeclarationName &Name) {
9779 switch (Name.getCXXOverloadedOperator()) {
9780 case OO_New: case OO_Array_New:
9781 case OO_Delete: case OO_Array_Delete:
9782 return false;
9783
9784 default:
9785 return true;
9786 }
9787}
9788
Richard Smithf50e88a2011-06-05 22:42:48 +00009789/// Attempt to recover from an ill-formed use of a non-dependent name in a
9790/// template, where the non-dependent name was declared after the template
9791/// was defined. This is common in code written for a compilers which do not
9792/// correctly implement two-stage name lookup.
9793///
9794/// Returns true if a viable candidate was found and a diagnostic was issued.
9795static bool
9796DiagnoseTwoPhaseLookup(Sema &SemaRef, SourceLocation FnLoc,
9797 const CXXScopeSpec &SS, LookupResult &R,
9798 TemplateArgumentListInfo *ExplicitTemplateArgs,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00009799 ArrayRef<Expr *> Args) {
Richard Smithf50e88a2011-06-05 22:42:48 +00009800 if (SemaRef.ActiveTemplateInstantiations.empty() || !SS.isEmpty())
9801 return false;
9802
9803 for (DeclContext *DC = SemaRef.CurContext; DC; DC = DC->getParent()) {
Nick Lewycky5a7120c2012-03-14 20:41:00 +00009804 if (DC->isTransparentContext())
9805 continue;
9806
Richard Smithf50e88a2011-06-05 22:42:48 +00009807 SemaRef.LookupQualifiedName(R, DC);
9808
9809 if (!R.empty()) {
9810 R.suppressDiagnostics();
9811
9812 if (isa<CXXRecordDecl>(DC)) {
9813 // Don't diagnose names we find in classes; we get much better
9814 // diagnostics for these from DiagnoseEmptyLookup.
9815 R.clear();
9816 return false;
9817 }
9818
9819 OverloadCandidateSet Candidates(FnLoc);
9820 for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I)
9821 AddOverloadedCallCandidate(SemaRef, I.getPair(),
Ahmed Charles13a140c2012-02-25 11:00:22 +00009822 ExplicitTemplateArgs, Args,
Richard Smith2ced0442011-06-26 22:19:54 +00009823 Candidates, false, /*KnownValid*/ false);
Richard Smithf50e88a2011-06-05 22:42:48 +00009824
9825 OverloadCandidateSet::iterator Best;
Richard Smith2ced0442011-06-26 22:19:54 +00009826 if (Candidates.BestViableFunction(SemaRef, FnLoc, Best) != OR_Success) {
Richard Smithf50e88a2011-06-05 22:42:48 +00009827 // No viable functions. Don't bother the user with notes for functions
9828 // which don't work and shouldn't be found anyway.
Richard Smith2ced0442011-06-26 22:19:54 +00009829 R.clear();
Richard Smithf50e88a2011-06-05 22:42:48 +00009830 return false;
Richard Smith2ced0442011-06-26 22:19:54 +00009831 }
Richard Smithf50e88a2011-06-05 22:42:48 +00009832
9833 // Find the namespaces where ADL would have looked, and suggest
9834 // declaring the function there instead.
9835 Sema::AssociatedNamespaceSet AssociatedNamespaces;
9836 Sema::AssociatedClassSet AssociatedClasses;
John McCall42f48fb2012-08-24 20:38:34 +00009837 SemaRef.FindAssociatedClassesAndNamespaces(FnLoc, Args,
Richard Smithf50e88a2011-06-05 22:42:48 +00009838 AssociatedNamespaces,
9839 AssociatedClasses);
Chandler Carruth74d487e2011-06-05 23:36:55 +00009840 Sema::AssociatedNamespaceSet SuggestedNamespaces;
Richard Smithd3ff3252013-06-12 22:56:54 +00009841 if (canBeDeclaredInNamespace(R.getLookupName())) {
9842 DeclContext *Std = SemaRef.getStdNamespace();
9843 for (Sema::AssociatedNamespaceSet::iterator
9844 it = AssociatedNamespaces.begin(),
9845 end = AssociatedNamespaces.end(); it != end; ++it) {
9846 // Never suggest declaring a function within namespace 'std'.
9847 if (Std && Std->Encloses(*it))
9848 continue;
Richard Smith19e0d952012-12-22 02:46:14 +00009849
Richard Smithd3ff3252013-06-12 22:56:54 +00009850 // Never suggest declaring a function within a namespace with a
9851 // reserved name, like __gnu_cxx.
9852 NamespaceDecl *NS = dyn_cast<NamespaceDecl>(*it);
9853 if (NS &&
9854 NS->getQualifiedNameAsString().find("__") != std::string::npos)
9855 continue;
9856
9857 SuggestedNamespaces.insert(*it);
9858 }
Richard Smithf50e88a2011-06-05 22:42:48 +00009859 }
9860
9861 SemaRef.Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup)
9862 << R.getLookupName();
Chandler Carruth74d487e2011-06-05 23:36:55 +00009863 if (SuggestedNamespaces.empty()) {
Richard Smithf50e88a2011-06-05 22:42:48 +00009864 SemaRef.Diag(Best->Function->getLocation(),
9865 diag::note_not_found_by_two_phase_lookup)
9866 << R.getLookupName() << 0;
Chandler Carruth74d487e2011-06-05 23:36:55 +00009867 } else if (SuggestedNamespaces.size() == 1) {
Richard Smithf50e88a2011-06-05 22:42:48 +00009868 SemaRef.Diag(Best->Function->getLocation(),
9869 diag::note_not_found_by_two_phase_lookup)
Chandler Carruth74d487e2011-06-05 23:36:55 +00009870 << R.getLookupName() << 1 << *SuggestedNamespaces.begin();
Richard Smithf50e88a2011-06-05 22:42:48 +00009871 } else {
9872 // FIXME: It would be useful to list the associated namespaces here,
9873 // but the diagnostics infrastructure doesn't provide a way to produce
9874 // a localized representation of a list of items.
9875 SemaRef.Diag(Best->Function->getLocation(),
9876 diag::note_not_found_by_two_phase_lookup)
9877 << R.getLookupName() << 2;
9878 }
9879
9880 // Try to recover by calling this function.
9881 return true;
9882 }
9883
9884 R.clear();
9885 }
9886
9887 return false;
9888}
9889
9890/// Attempt to recover from ill-formed use of a non-dependent operator in a
9891/// template, where the non-dependent operator was declared after the template
9892/// was defined.
9893///
9894/// Returns true if a viable candidate was found and a diagnostic was issued.
9895static bool
9896DiagnoseTwoPhaseOperatorLookup(Sema &SemaRef, OverloadedOperatorKind Op,
9897 SourceLocation OpLoc,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00009898 ArrayRef<Expr *> Args) {
Richard Smithf50e88a2011-06-05 22:42:48 +00009899 DeclarationName OpName =
9900 SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
9901 LookupResult R(SemaRef, OpName, OpLoc, Sema::LookupOperatorName);
9902 return DiagnoseTwoPhaseLookup(SemaRef, OpLoc, CXXScopeSpec(), R,
Ahmed Charles13a140c2012-02-25 11:00:22 +00009903 /*ExplicitTemplateArgs=*/0, Args);
Richard Smithf50e88a2011-06-05 22:42:48 +00009904}
9905
Kaelyn Uhrain60a09dc2012-01-25 18:37:44 +00009906namespace {
9907// Callback to limit the allowed keywords and to only accept typo corrections
9908// that are keywords or whose decls refer to functions (or template functions)
9909// that accept the given number of arguments.
9910class RecoveryCallCCC : public CorrectionCandidateCallback {
9911 public:
9912 RecoveryCallCCC(Sema &SemaRef, unsigned NumArgs, bool HasExplicitTemplateArgs)
9913 : NumArgs(NumArgs), HasExplicitTemplateArgs(HasExplicitTemplateArgs) {
David Blaikie4e4d0842012-03-11 07:00:24 +00009914 WantTypeSpecifiers = SemaRef.getLangOpts().CPlusPlus;
Kaelyn Uhrain60a09dc2012-01-25 18:37:44 +00009915 WantRemainingKeywords = false;
9916 }
9917
9918 virtual bool ValidateCandidate(const TypoCorrection &candidate) {
9919 if (!candidate.getCorrectionDecl())
9920 return candidate.isKeyword();
9921
9922 for (TypoCorrection::const_decl_iterator DI = candidate.begin(),
9923 DIEnd = candidate.end(); DI != DIEnd; ++DI) {
9924 FunctionDecl *FD = 0;
9925 NamedDecl *ND = (*DI)->getUnderlyingDecl();
9926 if (FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(ND))
9927 FD = FTD->getTemplatedDecl();
9928 if (!HasExplicitTemplateArgs && !FD) {
9929 if (!(FD = dyn_cast<FunctionDecl>(ND)) && isa<ValueDecl>(ND)) {
9930 // If the Decl is neither a function nor a template function,
9931 // determine if it is a pointer or reference to a function. If so,
9932 // check against the number of arguments expected for the pointee.
9933 QualType ValType = cast<ValueDecl>(ND)->getType();
9934 if (ValType->isAnyPointerType() || ValType->isReferenceType())
9935 ValType = ValType->getPointeeType();
9936 if (const FunctionProtoType *FPT = ValType->getAs<FunctionProtoType>())
9937 if (FPT->getNumArgs() == NumArgs)
9938 return true;
9939 }
9940 }
9941 if (FD && FD->getNumParams() >= NumArgs &&
9942 FD->getMinRequiredArguments() <= NumArgs)
9943 return true;
9944 }
9945 return false;
9946 }
9947
9948 private:
9949 unsigned NumArgs;
9950 bool HasExplicitTemplateArgs;
9951};
Kaelyn Uhrain3943b1c2012-01-25 21:11:35 +00009952
9953// Callback that effectively disabled typo correction
9954class NoTypoCorrectionCCC : public CorrectionCandidateCallback {
9955 public:
9956 NoTypoCorrectionCCC() {
9957 WantTypeSpecifiers = false;
9958 WantExpressionKeywords = false;
9959 WantCXXNamedCasts = false;
9960 WantRemainingKeywords = false;
9961 }
9962
9963 virtual bool ValidateCandidate(const TypoCorrection &candidate) {
9964 return false;
9965 }
9966};
Richard Smithe49ff3e2012-09-25 04:46:05 +00009967
9968class BuildRecoveryCallExprRAII {
9969 Sema &SemaRef;
9970public:
9971 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S) {
9972 assert(SemaRef.IsBuildingRecoveryCallExpr == false);
9973 SemaRef.IsBuildingRecoveryCallExpr = true;
9974 }
9975
9976 ~BuildRecoveryCallExprRAII() {
9977 SemaRef.IsBuildingRecoveryCallExpr = false;
9978 }
9979};
9980
Kaelyn Uhrain60a09dc2012-01-25 18:37:44 +00009981}
9982
John McCall578b69b2009-12-16 08:11:27 +00009983/// Attempts to recover from a call where no functions were found.
9984///
9985/// Returns true if new candidates were found.
John McCall60d7b3a2010-08-24 06:29:42 +00009986static ExprResult
Douglas Gregor1aae80b2010-04-14 20:27:54 +00009987BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn,
John McCall3b4294e2009-12-16 12:17:52 +00009988 UnresolvedLookupExpr *ULE,
9989 SourceLocation LParenLoc,
Ahmed Charles13a140c2012-02-25 11:00:22 +00009990 llvm::MutableArrayRef<Expr *> Args,
Richard Smithf50e88a2011-06-05 22:42:48 +00009991 SourceLocation RParenLoc,
Kaelyn Uhrain3943b1c2012-01-25 21:11:35 +00009992 bool EmptyLookup, bool AllowTypoCorrection) {
Richard Smithe49ff3e2012-09-25 04:46:05 +00009993 // Do not try to recover if it is already building a recovery call.
9994 // This stops infinite loops for template instantiations like
9995 //
9996 // template <typename T> auto foo(T t) -> decltype(foo(t)) {}
9997 // template <typename T> auto foo(T t) -> decltype(foo(&t)) {}
9998 //
9999 if (SemaRef.IsBuildingRecoveryCallExpr)
10000 return ExprError();
10001 BuildRecoveryCallExprRAII RCE(SemaRef);
John McCall578b69b2009-12-16 08:11:27 +000010002
10003 CXXScopeSpec SS;
Douglas Gregor4c9be892011-02-28 20:01:57 +000010004 SS.Adopt(ULE->getQualifierLoc());
Abramo Bagnarae4b92762012-01-27 09:46:47 +000010005 SourceLocation TemplateKWLoc = ULE->getTemplateKeywordLoc();
John McCall578b69b2009-12-16 08:11:27 +000010006
John McCall3b4294e2009-12-16 12:17:52 +000010007 TemplateArgumentListInfo TABuffer;
Richard Smithf50e88a2011-06-05 22:42:48 +000010008 TemplateArgumentListInfo *ExplicitTemplateArgs = 0;
John McCall3b4294e2009-12-16 12:17:52 +000010009 if (ULE->hasExplicitTemplateArgs()) {
10010 ULE->copyTemplateArgumentsInto(TABuffer);
10011 ExplicitTemplateArgs = &TABuffer;
10012 }
10013
John McCall578b69b2009-12-16 08:11:27 +000010014 LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(),
10015 Sema::LookupOrdinaryName);
Ahmed Charles13a140c2012-02-25 11:00:22 +000010016 RecoveryCallCCC Validator(SemaRef, Args.size(), ExplicitTemplateArgs != 0);
Kaelyn Uhrain3943b1c2012-01-25 21:11:35 +000010017 NoTypoCorrectionCCC RejectAll;
10018 CorrectionCandidateCallback *CCC = AllowTypoCorrection ?
10019 (CorrectionCandidateCallback*)&Validator :
10020 (CorrectionCandidateCallback*)&RejectAll;
Richard Smithf50e88a2011-06-05 22:42:48 +000010021 if (!DiagnoseTwoPhaseLookup(SemaRef, Fn->getExprLoc(), SS, R,
Ahmed Charles13a140c2012-02-25 11:00:22 +000010022 ExplicitTemplateArgs, Args) &&
Richard Smithf50e88a2011-06-05 22:42:48 +000010023 (!EmptyLookup ||
Kaelyn Uhrain3943b1c2012-01-25 21:11:35 +000010024 SemaRef.DiagnoseEmptyLookup(S, SS, R, *CCC,
Ahmed Charles13a140c2012-02-25 11:00:22 +000010025 ExplicitTemplateArgs, Args)))
John McCallf312b1e2010-08-26 23:41:50 +000010026 return ExprError();
John McCall578b69b2009-12-16 08:11:27 +000010027
John McCall3b4294e2009-12-16 12:17:52 +000010028 assert(!R.empty() && "lookup results empty despite recovery");
10029
10030 // Build an implicit member call if appropriate. Just drop the
10031 // casts and such from the call, we don't really care.
John McCallf312b1e2010-08-26 23:41:50 +000010032 ExprResult NewFn = ExprError();
John McCall3b4294e2009-12-16 12:17:52 +000010033 if ((*R.begin())->isCXXClassMember())
Abramo Bagnarae4b92762012-01-27 09:46:47 +000010034 NewFn = SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc,
10035 R, ExplicitTemplateArgs);
Abramo Bagnara9d9922a2012-02-06 14:31:00 +000010036 else if (ExplicitTemplateArgs || TemplateKWLoc.isValid())
Abramo Bagnarae4b92762012-01-27 09:46:47 +000010037 NewFn = SemaRef.BuildTemplateIdExpr(SS, TemplateKWLoc, R, false,
Abramo Bagnara9d9922a2012-02-06 14:31:00 +000010038 ExplicitTemplateArgs);
John McCall3b4294e2009-12-16 12:17:52 +000010039 else
10040 NewFn = SemaRef.BuildDeclarationNameExpr(SS, R, false);
10041
10042 if (NewFn.isInvalid())
John McCallf312b1e2010-08-26 23:41:50 +000010043 return ExprError();
John McCall3b4294e2009-12-16 12:17:52 +000010044
10045 // This shouldn't cause an infinite loop because we're giving it
Richard Smithf50e88a2011-06-05 22:42:48 +000010046 // an expression with viable lookup results, which should never
John McCall3b4294e2009-12-16 12:17:52 +000010047 // end up here.
John McCall9ae2f072010-08-23 23:25:46 +000010048 return SemaRef.ActOnCallExpr(/*Scope*/ 0, NewFn.take(), LParenLoc,
Ahmed Charles13a140c2012-02-25 11:00:22 +000010049 MultiExprArg(Args.data(), Args.size()),
10050 RParenLoc);
John McCall578b69b2009-12-16 08:11:27 +000010051}
Douglas Gregord7a95972010-06-08 17:35:15 +000010052
Sam Panzere1715b62012-08-21 00:52:01 +000010053/// \brief Constructs and populates an OverloadedCandidateSet from
10054/// the given function.
10055/// \returns true when an the ExprResult output parameter has been set.
10056bool Sema::buildOverloadedCallSet(Scope *S, Expr *Fn,
10057 UnresolvedLookupExpr *ULE,
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010058 MultiExprArg Args,
Sam Panzere1715b62012-08-21 00:52:01 +000010059 SourceLocation RParenLoc,
10060 OverloadCandidateSet *CandidateSet,
10061 ExprResult *Result) {
John McCall3b4294e2009-12-16 12:17:52 +000010062#ifndef NDEBUG
10063 if (ULE->requiresADL()) {
10064 // To do ADL, we must have found an unqualified name.
10065 assert(!ULE->getQualifier() && "qualified name with ADL");
10066
10067 // We don't perform ADL for implicit declarations of builtins.
10068 // Verify that this was correctly set up.
10069 FunctionDecl *F;
10070 if (ULE->decls_begin() + 1 == ULE->decls_end() &&
10071 (F = dyn_cast<FunctionDecl>(*ULE->decls_begin())) &&
10072 F->getBuiltinID() && F->isImplicit())
David Blaikieb219cfc2011-09-23 05:06:16 +000010073 llvm_unreachable("performing ADL for builtin");
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010074
John McCall3b4294e2009-12-16 12:17:52 +000010075 // We don't perform ADL in C.
David Blaikie4e4d0842012-03-11 07:00:24 +000010076 assert(getLangOpts().CPlusPlus && "ADL enabled in C");
Richard Smithb1502bc2012-10-18 17:56:02 +000010077 }
John McCall3b4294e2009-12-16 12:17:52 +000010078#endif
10079
John McCall5acb0c92011-10-17 18:40:02 +000010080 UnbridgedCastsSet UnbridgedCasts;
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010081 if (checkArgPlaceholdersForOverload(*this, Args, UnbridgedCasts)) {
Sam Panzere1715b62012-08-21 00:52:01 +000010082 *Result = ExprError();
10083 return true;
10084 }
Douglas Gregor17330012009-02-04 15:01:18 +000010085
John McCall3b4294e2009-12-16 12:17:52 +000010086 // Add the functions denoted by the callee to the set of candidate
10087 // functions, including those from argument-dependent lookup.
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010088 AddOverloadedCallCandidates(ULE, Args, *CandidateSet);
John McCall578b69b2009-12-16 08:11:27 +000010089
10090 // If we found nothing, try to recover.
Richard Smithf50e88a2011-06-05 22:42:48 +000010091 // BuildRecoveryCallExpr diagnoses the error itself, so we just bail
10092 // out if it fails.
Sam Panzere1715b62012-08-21 00:52:01 +000010093 if (CandidateSet->empty()) {
Sebastian Redl14b0c192011-09-24 17:48:00 +000010094 // In Microsoft mode, if we are inside a template class member function then
10095 // create a type dependent CallExpr. The goal is to postpone name lookup
Francois Pichet0f74d1e2011-09-07 00:14:57 +000010096 // to instantiation time to be able to search into type dependent base
Sebastian Redl14b0c192011-09-24 17:48:00 +000010097 // classes.
David Blaikie4e4d0842012-03-11 07:00:24 +000010098 if (getLangOpts().MicrosoftMode && CurContext->isDependentContext() &&
Francois Pichetc8ff9152011-11-25 01:10:54 +000010099 (isa<FunctionDecl>(CurContext) || isa<CXXRecordDecl>(CurContext))) {
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010100 CallExpr *CE = new (Context) CallExpr(Context, Fn, Args,
Benjamin Kramer3b6bef92012-08-24 11:54:20 +000010101 Context.DependentTy, VK_RValue,
10102 RParenLoc);
Sebastian Redl14b0c192011-09-24 17:48:00 +000010103 CE->setTypeDependent(true);
Sam Panzere1715b62012-08-21 00:52:01 +000010104 *Result = Owned(CE);
10105 return true;
Sebastian Redl14b0c192011-09-24 17:48:00 +000010106 }
Sam Panzere1715b62012-08-21 00:52:01 +000010107 return false;
Francois Pichet0f74d1e2011-09-07 00:14:57 +000010108 }
John McCall578b69b2009-12-16 08:11:27 +000010109
John McCall5acb0c92011-10-17 18:40:02 +000010110 UnbridgedCasts.restore();
Sam Panzere1715b62012-08-21 00:52:01 +000010111 return false;
10112}
John McCall5acb0c92011-10-17 18:40:02 +000010113
Sam Panzere1715b62012-08-21 00:52:01 +000010114/// FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns
10115/// the completed call expression. If overload resolution fails, emits
10116/// diagnostics and returns ExprError()
10117static ExprResult FinishOverloadedCallExpr(Sema &SemaRef, Scope *S, Expr *Fn,
10118 UnresolvedLookupExpr *ULE,
10119 SourceLocation LParenLoc,
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010120 MultiExprArg Args,
Sam Panzere1715b62012-08-21 00:52:01 +000010121 SourceLocation RParenLoc,
10122 Expr *ExecConfig,
10123 OverloadCandidateSet *CandidateSet,
10124 OverloadCandidateSet::iterator *Best,
10125 OverloadingResult OverloadResult,
10126 bool AllowTypoCorrection) {
10127 if (CandidateSet->empty())
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010128 return BuildRecoveryCallExpr(SemaRef, S, Fn, ULE, LParenLoc, Args,
Sam Panzere1715b62012-08-21 00:52:01 +000010129 RParenLoc, /*EmptyLookup=*/true,
10130 AllowTypoCorrection);
10131
10132 switch (OverloadResult) {
John McCall3b4294e2009-12-16 12:17:52 +000010133 case OR_Success: {
Sam Panzere1715b62012-08-21 00:52:01 +000010134 FunctionDecl *FDecl = (*Best)->Function;
Sam Panzere1715b62012-08-21 00:52:01 +000010135 SemaRef.CheckUnresolvedLookupAccess(ULE, (*Best)->FoundDecl);
Richard Smith82f145d2013-05-04 06:44:46 +000010136 if (SemaRef.DiagnoseUseOfDecl(FDecl, ULE->getNameLoc()))
10137 return ExprError();
Sam Panzere1715b62012-08-21 00:52:01 +000010138 Fn = SemaRef.FixOverloadedFunctionReference(Fn, (*Best)->FoundDecl, FDecl);
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010139 return SemaRef.BuildResolvedCallExpr(Fn, FDecl, LParenLoc, Args, RParenLoc,
10140 ExecConfig);
John McCall3b4294e2009-12-16 12:17:52 +000010141 }
Douglas Gregorf6b89692008-11-26 05:54:23 +000010142
Richard Smithf50e88a2011-06-05 22:42:48 +000010143 case OR_No_Viable_Function: {
10144 // Try to recover by looking for viable functions which the user might
10145 // have meant to call.
Sam Panzere1715b62012-08-21 00:52:01 +000010146 ExprResult Recovery = BuildRecoveryCallExpr(SemaRef, S, Fn, ULE, LParenLoc,
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010147 Args, RParenLoc,
Kaelyn Uhrain3943b1c2012-01-25 21:11:35 +000010148 /*EmptyLookup=*/false,
10149 AllowTypoCorrection);
Richard Smithf50e88a2011-06-05 22:42:48 +000010150 if (!Recovery.isInvalid())
10151 return Recovery;
10152
Sam Panzere1715b62012-08-21 00:52:01 +000010153 SemaRef.Diag(Fn->getLocStart(),
Douglas Gregorf6b89692008-11-26 05:54:23 +000010154 diag::err_ovl_no_viable_function_in_call)
John McCall3b4294e2009-12-16 12:17:52 +000010155 << ULE->getName() << Fn->getSourceRange();
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010156 CandidateSet->NoteCandidates(SemaRef, OCD_AllCandidates, Args);
Douglas Gregorf6b89692008-11-26 05:54:23 +000010157 break;
Richard Smithf50e88a2011-06-05 22:42:48 +000010158 }
Douglas Gregorf6b89692008-11-26 05:54:23 +000010159
10160 case OR_Ambiguous:
Sam Panzere1715b62012-08-21 00:52:01 +000010161 SemaRef.Diag(Fn->getLocStart(), diag::err_ovl_ambiguous_call)
John McCall3b4294e2009-12-16 12:17:52 +000010162 << ULE->getName() << Fn->getSourceRange();
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010163 CandidateSet->NoteCandidates(SemaRef, OCD_ViableCandidates, Args);
Douglas Gregorf6b89692008-11-26 05:54:23 +000010164 break;
Douglas Gregor48f3bb92009-02-18 21:56:37 +000010165
Sam Panzere1715b62012-08-21 00:52:01 +000010166 case OR_Deleted: {
10167 SemaRef.Diag(Fn->getLocStart(), diag::err_ovl_deleted_call)
10168 << (*Best)->Function->isDeleted()
10169 << ULE->getName()
10170 << SemaRef.getDeletedOrUnavailableSuffix((*Best)->Function)
10171 << Fn->getSourceRange();
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010172 CandidateSet->NoteCandidates(SemaRef, OCD_AllCandidates, Args);
Argyrios Kyrtzidis0d579b62011-11-04 15:58:13 +000010173
Sam Panzere1715b62012-08-21 00:52:01 +000010174 // We emitted an error for the unvailable/deleted function call but keep
10175 // the call in the AST.
10176 FunctionDecl *FDecl = (*Best)->Function;
10177 Fn = SemaRef.FixOverloadedFunctionReference(Fn, (*Best)->FoundDecl, FDecl);
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010178 return SemaRef.BuildResolvedCallExpr(Fn, FDecl, LParenLoc, Args, RParenLoc,
10179 ExecConfig);
Sam Panzere1715b62012-08-21 00:52:01 +000010180 }
Douglas Gregorf6b89692008-11-26 05:54:23 +000010181 }
10182
Douglas Gregorff331c12010-07-25 18:17:45 +000010183 // Overload resolution failed.
John McCall3b4294e2009-12-16 12:17:52 +000010184 return ExprError();
Douglas Gregorf6b89692008-11-26 05:54:23 +000010185}
10186
Sam Panzere1715b62012-08-21 00:52:01 +000010187/// BuildOverloadedCallExpr - Given the call expression that calls Fn
10188/// (which eventually refers to the declaration Func) and the call
10189/// arguments Args/NumArgs, attempt to resolve the function call down
10190/// to a specific function. If overload resolution succeeds, returns
10191/// the call expression produced by overload resolution.
10192/// Otherwise, emits diagnostics and returns ExprError.
10193ExprResult Sema::BuildOverloadedCallExpr(Scope *S, Expr *Fn,
10194 UnresolvedLookupExpr *ULE,
10195 SourceLocation LParenLoc,
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010196 MultiExprArg Args,
Sam Panzere1715b62012-08-21 00:52:01 +000010197 SourceLocation RParenLoc,
10198 Expr *ExecConfig,
10199 bool AllowTypoCorrection) {
10200 OverloadCandidateSet CandidateSet(Fn->getExprLoc());
10201 ExprResult result;
10202
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010203 if (buildOverloadedCallSet(S, Fn, ULE, Args, LParenLoc, &CandidateSet,
10204 &result))
Sam Panzere1715b62012-08-21 00:52:01 +000010205 return result;
10206
10207 OverloadCandidateSet::iterator Best;
10208 OverloadingResult OverloadResult =
10209 CandidateSet.BestViableFunction(*this, Fn->getLocStart(), Best);
10210
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010211 return FinishOverloadedCallExpr(*this, S, Fn, ULE, LParenLoc, Args,
Sam Panzere1715b62012-08-21 00:52:01 +000010212 RParenLoc, ExecConfig, &CandidateSet,
10213 &Best, OverloadResult,
10214 AllowTypoCorrection);
10215}
10216
John McCall6e266892010-01-26 03:27:55 +000010217static bool IsOverloaded(const UnresolvedSetImpl &Functions) {
John McCall7453ed42009-11-22 00:44:51 +000010218 return Functions.size() > 1 ||
10219 (Functions.size() == 1 && isa<FunctionTemplateDecl>(*Functions.begin()));
10220}
10221
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010222/// \brief Create a unary operation that may resolve to an overloaded
10223/// operator.
10224///
10225/// \param OpLoc The location of the operator itself (e.g., '*').
10226///
10227/// \param OpcIn The UnaryOperator::Opcode that describes this
10228/// operator.
10229///
James Dennett40ae6662012-06-22 08:52:37 +000010230/// \param Fns The set of non-member functions that will be
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010231/// considered by overload resolution. The caller needs to build this
10232/// set based on the context using, e.g.,
10233/// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10234/// set should not contain any member functions; those will be added
10235/// by CreateOverloadedUnaryOp().
10236///
James Dennett8da16872012-06-22 10:32:46 +000010237/// \param Input The input argument.
John McCall60d7b3a2010-08-24 06:29:42 +000010238ExprResult
John McCall6e266892010-01-26 03:27:55 +000010239Sema::CreateOverloadedUnaryOp(SourceLocation OpLoc, unsigned OpcIn,
10240 const UnresolvedSetImpl &Fns,
John McCall9ae2f072010-08-23 23:25:46 +000010241 Expr *Input) {
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010242 UnaryOperator::Opcode Opc = static_cast<UnaryOperator::Opcode>(OpcIn);
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010243
10244 OverloadedOperatorKind Op = UnaryOperator::getOverloadedOperator(Opc);
10245 assert(Op != OO_None && "Invalid opcode for overloaded unary operator");
10246 DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(Op);
Abramo Bagnara25777432010-08-11 22:01:17 +000010247 // TODO: provide better source location info.
10248 DeclarationNameInfo OpNameInfo(OpName, OpLoc);
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010249
John McCall5acb0c92011-10-17 18:40:02 +000010250 if (checkPlaceholderForOverload(*this, Input))
10251 return ExprError();
John McCall0e800c92010-12-04 08:14:53 +000010252
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010253 Expr *Args[2] = { Input, 0 };
10254 unsigned NumArgs = 1;
Mike Stump1eb44332009-09-09 15:08:12 +000010255
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010256 // For post-increment and post-decrement, add the implicit '0' as
10257 // the second argument, so that we know this is a post-increment or
10258 // post-decrement.
John McCall2de56d12010-08-25 11:45:40 +000010259 if (Opc == UO_PostInc || Opc == UO_PostDec) {
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010260 llvm::APSInt Zero(Context.getTypeSize(Context.IntTy), false);
Argyrios Kyrtzidis9996a7f2010-08-28 09:06:06 +000010261 Args[1] = IntegerLiteral::Create(Context, Zero, Context.IntTy,
10262 SourceLocation());
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010263 NumArgs = 2;
10264 }
10265
Richard Smith958ba642013-05-05 15:51:06 +000010266 ArrayRef<Expr *> ArgsArray(Args, NumArgs);
10267
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010268 if (Input->isTypeDependent()) {
Douglas Gregor1ec8ef72010-06-17 15:46:20 +000010269 if (Fns.empty())
John McCall9ae2f072010-08-23 23:25:46 +000010270 return Owned(new (Context) UnaryOperator(Input,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010271 Opc,
Douglas Gregor1ec8ef72010-06-17 15:46:20 +000010272 Context.DependentTy,
John McCallf89e55a2010-11-18 06:31:45 +000010273 VK_RValue, OK_Ordinary,
Douglas Gregor1ec8ef72010-06-17 15:46:20 +000010274 OpLoc));
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010275
John McCallc373d482010-01-27 01:50:18 +000010276 CXXRecordDecl *NamingClass = 0; // because lookup ignores member operators
John McCallba135432009-11-21 08:51:07 +000010277 UnresolvedLookupExpr *Fn
Douglas Gregorbebbe0d2010-12-15 01:34:56 +000010278 = UnresolvedLookupExpr::Create(Context, NamingClass,
Douglas Gregor4c9be892011-02-28 20:01:57 +000010279 NestedNameSpecifierLoc(), OpNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +000010280 /*ADL*/ true, IsOverloaded(Fns),
10281 Fns.begin(), Fns.end());
Richard Smith958ba642013-05-05 15:51:06 +000010282 return Owned(new (Context) CXXOperatorCallExpr(Context, Op, Fn, ArgsArray,
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010283 Context.DependentTy,
John McCallf89e55a2010-11-18 06:31:45 +000010284 VK_RValue,
Lang Hamesbe9af122012-10-02 04:45:10 +000010285 OpLoc, false));
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010286 }
10287
10288 // Build an empty overload set.
John McCall5769d612010-02-08 23:07:23 +000010289 OverloadCandidateSet CandidateSet(OpLoc);
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010290
10291 // Add the candidates from the given function set.
Richard Smith958ba642013-05-05 15:51:06 +000010292 AddFunctionCandidates(Fns, ArgsArray, CandidateSet, false);
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010293
10294 // Add operator candidates that are member functions.
Richard Smith958ba642013-05-05 15:51:06 +000010295 AddMemberOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010296
John McCall6e266892010-01-26 03:27:55 +000010297 // Add candidates from ADL.
Richard Smith958ba642013-05-05 15:51:06 +000010298 AddArgumentDependentLookupCandidates(OpName, /*Operator*/ true, OpLoc,
10299 ArgsArray, /*ExplicitTemplateArgs*/ 0,
John McCall6e266892010-01-26 03:27:55 +000010300 CandidateSet);
10301
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010302 // Add builtin operator candidates.
Richard Smith958ba642013-05-05 15:51:06 +000010303 AddBuiltinOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010304
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000010305 bool HadMultipleCandidates = (CandidateSet.size() > 1);
10306
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010307 // Perform overload resolution.
10308 OverloadCandidateSet::iterator Best;
John McCall120d63c2010-08-24 20:38:10 +000010309 switch (CandidateSet.BestViableFunction(*this, OpLoc, Best)) {
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010310 case OR_Success: {
10311 // We found a built-in operator or an overloaded operator.
10312 FunctionDecl *FnDecl = Best->Function;
Mike Stump1eb44332009-09-09 15:08:12 +000010313
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010314 if (FnDecl) {
10315 // We matched an overloaded operator. Build a call to that
10316 // operator.
Mike Stump1eb44332009-09-09 15:08:12 +000010317
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010318 // Convert the arguments.
10319 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FnDecl)) {
John McCall9aa472c2010-03-19 07:35:19 +000010320 CheckMemberOperatorAccess(OpLoc, Args[0], 0, Best->FoundDecl);
John McCall5357b612010-01-28 01:42:12 +000010321
John Wiegley429bb272011-04-08 18:41:53 +000010322 ExprResult InputRes =
10323 PerformObjectArgumentInitialization(Input, /*Qualifier=*/0,
10324 Best->FoundDecl, Method);
10325 if (InputRes.isInvalid())
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010326 return ExprError();
John Wiegley429bb272011-04-08 18:41:53 +000010327 Input = InputRes.take();
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010328 } else {
10329 // Convert the arguments.
John McCall60d7b3a2010-08-24 06:29:42 +000010330 ExprResult InputInit
Douglas Gregore1a5c172009-12-23 17:40:29 +000010331 = PerformCopyInitialization(InitializedEntity::InitializeParameter(
Fariborz Jahanian745da3a2010-09-24 17:30:16 +000010332 Context,
Douglas Gregorbaecfed2009-12-23 00:02:00 +000010333 FnDecl->getParamDecl(0)),
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010334 SourceLocation(),
John McCall9ae2f072010-08-23 23:25:46 +000010335 Input);
Douglas Gregore1a5c172009-12-23 17:40:29 +000010336 if (InputInit.isInvalid())
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010337 return ExprError();
John McCall9ae2f072010-08-23 23:25:46 +000010338 Input = InputInit.take();
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010339 }
10340
John McCallf89e55a2010-11-18 06:31:45 +000010341 // Determine the result type.
10342 QualType ResultTy = FnDecl->getResultType();
10343 ExprValueKind VK = Expr::getValueKindForType(ResultTy);
10344 ResultTy = ResultTy.getNonLValueExprType(Context);
Mike Stump1eb44332009-09-09 15:08:12 +000010345
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010346 // Build the actual expression node.
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000010347 ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl, Best->FoundDecl,
Argyrios Kyrtzidis46e75472012-02-08 01:21:13 +000010348 HadMultipleCandidates, OpLoc);
John Wiegley429bb272011-04-08 18:41:53 +000010349 if (FnExpr.isInvalid())
10350 return ExprError();
Mike Stump1eb44332009-09-09 15:08:12 +000010351
Eli Friedman4c3b8962009-11-18 03:58:17 +000010352 Args[0] = Input;
John McCall9ae2f072010-08-23 23:25:46 +000010353 CallExpr *TheCall =
Richard Smith958ba642013-05-05 15:51:06 +000010354 new (Context) CXXOperatorCallExpr(Context, Op, FnExpr.take(), ArgsArray,
Lang Hamesbe9af122012-10-02 04:45:10 +000010355 ResultTy, VK, OpLoc, false);
John McCallb697e082010-05-06 18:15:07 +000010356
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010357 if (CheckCallReturnType(FnDecl->getResultType(), OpLoc, TheCall,
Anders Carlsson26a2a072009-10-13 21:19:37 +000010358 FnDecl))
10359 return ExprError();
10360
John McCall9ae2f072010-08-23 23:25:46 +000010361 return MaybeBindToTemporary(TheCall);
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010362 } else {
10363 // We matched a built-in operator. Convert the arguments, then
10364 // break out so that we will build the appropriate built-in
10365 // operator node.
John Wiegley429bb272011-04-08 18:41:53 +000010366 ExprResult InputRes =
10367 PerformImplicitConversion(Input, Best->BuiltinTypes.ParamTypes[0],
10368 Best->Conversions[0], AA_Passing);
10369 if (InputRes.isInvalid())
10370 return ExprError();
10371 Input = InputRes.take();
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010372 break;
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010373 }
John Wiegley429bb272011-04-08 18:41:53 +000010374 }
10375
10376 case OR_No_Viable_Function:
Richard Smithf50e88a2011-06-05 22:42:48 +000010377 // This is an erroneous use of an operator which can be overloaded by
10378 // a non-member function. Check for non-member operators which were
10379 // defined too late to be candidates.
Richard Smith958ba642013-05-05 15:51:06 +000010380 if (DiagnoseTwoPhaseOperatorLookup(*this, Op, OpLoc, ArgsArray))
Richard Smithf50e88a2011-06-05 22:42:48 +000010381 // FIXME: Recover by calling the found function.
10382 return ExprError();
10383
John Wiegley429bb272011-04-08 18:41:53 +000010384 // No viable function; fall through to handling this as a
10385 // built-in operator, which will produce an error message for us.
10386 break;
10387
10388 case OR_Ambiguous:
10389 Diag(OpLoc, diag::err_ovl_ambiguous_oper_unary)
10390 << UnaryOperator::getOpcodeStr(Opc)
10391 << Input->getType()
10392 << Input->getSourceRange();
Richard Smith958ba642013-05-05 15:51:06 +000010393 CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, ArgsArray,
John Wiegley429bb272011-04-08 18:41:53 +000010394 UnaryOperator::getOpcodeStr(Opc), OpLoc);
10395 return ExprError();
10396
10397 case OR_Deleted:
10398 Diag(OpLoc, diag::err_ovl_deleted_oper)
10399 << Best->Function->isDeleted()
10400 << UnaryOperator::getOpcodeStr(Opc)
10401 << getDeletedOrUnavailableSuffix(Best->Function)
10402 << Input->getSourceRange();
Richard Smith958ba642013-05-05 15:51:06 +000010403 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, ArgsArray,
Eli Friedman1795d372011-08-26 19:46:22 +000010404 UnaryOperator::getOpcodeStr(Opc), OpLoc);
John Wiegley429bb272011-04-08 18:41:53 +000010405 return ExprError();
10406 }
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010407
10408 // Either we found no viable overloaded operator or we matched a
10409 // built-in operator. In either case, fall through to trying to
10410 // build a built-in operation.
John McCall9ae2f072010-08-23 23:25:46 +000010411 return CreateBuiltinUnaryOp(OpLoc, Opc, Input);
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010412}
10413
Douglas Gregor063daf62009-03-13 18:40:31 +000010414/// \brief Create a binary operation that may resolve to an overloaded
10415/// operator.
10416///
10417/// \param OpLoc The location of the operator itself (e.g., '+').
10418///
10419/// \param OpcIn The BinaryOperator::Opcode that describes this
10420/// operator.
10421///
James Dennett40ae6662012-06-22 08:52:37 +000010422/// \param Fns The set of non-member functions that will be
Douglas Gregor063daf62009-03-13 18:40:31 +000010423/// considered by overload resolution. The caller needs to build this
10424/// set based on the context using, e.g.,
10425/// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10426/// set should not contain any member functions; those will be added
10427/// by CreateOverloadedBinOp().
10428///
10429/// \param LHS Left-hand argument.
10430/// \param RHS Right-hand argument.
John McCall60d7b3a2010-08-24 06:29:42 +000010431ExprResult
Douglas Gregor063daf62009-03-13 18:40:31 +000010432Sema::CreateOverloadedBinOp(SourceLocation OpLoc,
Mike Stump1eb44332009-09-09 15:08:12 +000010433 unsigned OpcIn,
John McCall6e266892010-01-26 03:27:55 +000010434 const UnresolvedSetImpl &Fns,
Douglas Gregor063daf62009-03-13 18:40:31 +000010435 Expr *LHS, Expr *RHS) {
Douglas Gregor063daf62009-03-13 18:40:31 +000010436 Expr *Args[2] = { LHS, RHS };
Douglas Gregorc3384cb2009-08-26 17:08:25 +000010437 LHS=RHS=0; //Please use only Args instead of LHS/RHS couple
Douglas Gregor063daf62009-03-13 18:40:31 +000010438
10439 BinaryOperator::Opcode Opc = static_cast<BinaryOperator::Opcode>(OpcIn);
10440 OverloadedOperatorKind Op = BinaryOperator::getOverloadedOperator(Opc);
10441 DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(Op);
10442
10443 // If either side is type-dependent, create an appropriate dependent
10444 // expression.
Douglas Gregorc3384cb2009-08-26 17:08:25 +000010445 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
John McCall6e266892010-01-26 03:27:55 +000010446 if (Fns.empty()) {
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010447 // If there are no functions to store, just build a dependent
Douglas Gregor6ca7cfb2009-11-05 00:51:44 +000010448 // BinaryOperator or CompoundAssignment.
John McCall2de56d12010-08-25 11:45:40 +000010449 if (Opc <= BO_Assign || Opc > BO_OrAssign)
Douglas Gregor6ca7cfb2009-11-05 00:51:44 +000010450 return Owned(new (Context) BinaryOperator(Args[0], Args[1], Opc,
John McCallf89e55a2010-11-18 06:31:45 +000010451 Context.DependentTy,
10452 VK_RValue, OK_Ordinary,
Lang Hamesbe9af122012-10-02 04:45:10 +000010453 OpLoc,
10454 FPFeatures.fp_contract));
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010455
Douglas Gregor6ca7cfb2009-11-05 00:51:44 +000010456 return Owned(new (Context) CompoundAssignOperator(Args[0], Args[1], Opc,
10457 Context.DependentTy,
John McCallf89e55a2010-11-18 06:31:45 +000010458 VK_LValue,
10459 OK_Ordinary,
Douglas Gregor6ca7cfb2009-11-05 00:51:44 +000010460 Context.DependentTy,
10461 Context.DependentTy,
Lang Hamesbe9af122012-10-02 04:45:10 +000010462 OpLoc,
10463 FPFeatures.fp_contract));
Douglas Gregor6ca7cfb2009-11-05 00:51:44 +000010464 }
John McCall6e266892010-01-26 03:27:55 +000010465
10466 // FIXME: save results of ADL from here?
John McCallc373d482010-01-27 01:50:18 +000010467 CXXRecordDecl *NamingClass = 0; // because lookup ignores member operators
Abramo Bagnara25777432010-08-11 22:01:17 +000010468 // TODO: provide better source location info in DNLoc component.
10469 DeclarationNameInfo OpNameInfo(OpName, OpLoc);
John McCallba135432009-11-21 08:51:07 +000010470 UnresolvedLookupExpr *Fn
Douglas Gregor4c9be892011-02-28 20:01:57 +000010471 = UnresolvedLookupExpr::Create(Context, NamingClass,
10472 NestedNameSpecifierLoc(), OpNameInfo,
10473 /*ADL*/ true, IsOverloaded(Fns),
Douglas Gregor5a84dec2010-05-23 18:57:34 +000010474 Fns.begin(), Fns.end());
Lang Hamesbe9af122012-10-02 04:45:10 +000010475 return Owned(new (Context) CXXOperatorCallExpr(Context, Op, Fn, Args,
10476 Context.DependentTy, VK_RValue,
10477 OpLoc, FPFeatures.fp_contract));
Douglas Gregor063daf62009-03-13 18:40:31 +000010478 }
10479
John McCall5acb0c92011-10-17 18:40:02 +000010480 // Always do placeholder-like conversions on the RHS.
10481 if (checkPlaceholderForOverload(*this, Args[1]))
10482 return ExprError();
John McCall0e800c92010-12-04 08:14:53 +000010483
John McCall3c3b7f92011-10-25 17:37:35 +000010484 // Do placeholder-like conversion on the LHS; note that we should
10485 // not get here with a PseudoObject LHS.
10486 assert(Args[0]->getObjectKind() != OK_ObjCProperty);
John McCall5acb0c92011-10-17 18:40:02 +000010487 if (checkPlaceholderForOverload(*this, Args[0]))
10488 return ExprError();
10489
Sebastian Redl275c2b42009-11-18 23:10:33 +000010490 // If this is the assignment operator, we only perform overload resolution
10491 // if the left-hand side is a class or enumeration type. This is actually
10492 // a hack. The standard requires that we do overload resolution between the
10493 // various built-in candidates, but as DR507 points out, this can lead to
10494 // problems. So we do it this way, which pretty much follows what GCC does.
10495 // Note that we go the traditional code path for compound assignment forms.
John McCall2de56d12010-08-25 11:45:40 +000010496 if (Opc == BO_Assign && !Args[0]->getType()->isOverloadableType())
Douglas Gregorc3384cb2009-08-26 17:08:25 +000010497 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
Douglas Gregor063daf62009-03-13 18:40:31 +000010498
John McCall0e800c92010-12-04 08:14:53 +000010499 // If this is the .* operator, which is not overloadable, just
10500 // create a built-in binary operator.
10501 if (Opc == BO_PtrMemD)
10502 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
10503
Douglas Gregorbc736fc2009-03-13 23:49:33 +000010504 // Build an empty overload set.
John McCall5769d612010-02-08 23:07:23 +000010505 OverloadCandidateSet CandidateSet(OpLoc);
Douglas Gregor063daf62009-03-13 18:40:31 +000010506
10507 // Add the candidates from the given function set.
Ahmed Charles13a140c2012-02-25 11:00:22 +000010508 AddFunctionCandidates(Fns, Args, CandidateSet, false);
Douglas Gregor063daf62009-03-13 18:40:31 +000010509
10510 // Add operator candidates that are member functions.
Richard Smith958ba642013-05-05 15:51:06 +000010511 AddMemberOperatorCandidates(Op, OpLoc, Args, CandidateSet);
Douglas Gregor063daf62009-03-13 18:40:31 +000010512
John McCall6e266892010-01-26 03:27:55 +000010513 // Add candidates from ADL.
10514 AddArgumentDependentLookupCandidates(OpName, /*Operator*/ true,
Ahmed Charles13a140c2012-02-25 11:00:22 +000010515 OpLoc, Args,
John McCall6e266892010-01-26 03:27:55 +000010516 /*ExplicitTemplateArgs*/ 0,
10517 CandidateSet);
10518
Douglas Gregor063daf62009-03-13 18:40:31 +000010519 // Add builtin operator candidates.
Richard Smith958ba642013-05-05 15:51:06 +000010520 AddBuiltinOperatorCandidates(Op, OpLoc, Args, CandidateSet);
Douglas Gregor063daf62009-03-13 18:40:31 +000010521
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000010522 bool HadMultipleCandidates = (CandidateSet.size() > 1);
10523
Douglas Gregor063daf62009-03-13 18:40:31 +000010524 // Perform overload resolution.
10525 OverloadCandidateSet::iterator Best;
John McCall120d63c2010-08-24 20:38:10 +000010526 switch (CandidateSet.BestViableFunction(*this, OpLoc, Best)) {
Sebastian Redl3201f6b2009-04-16 17:51:27 +000010527 case OR_Success: {
Douglas Gregor063daf62009-03-13 18:40:31 +000010528 // We found a built-in operator or an overloaded operator.
10529 FunctionDecl *FnDecl = Best->Function;
10530
10531 if (FnDecl) {
10532 // We matched an overloaded operator. Build a call to that
10533 // operator.
10534
10535 // Convert the arguments.
10536 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FnDecl)) {
John McCall5357b612010-01-28 01:42:12 +000010537 // Best->Access is only meaningful for class members.
John McCall9aa472c2010-03-19 07:35:19 +000010538 CheckMemberOperatorAccess(OpLoc, Args[0], Args[1], Best->FoundDecl);
John McCall5357b612010-01-28 01:42:12 +000010539
Chandler Carruth6df868e2010-12-12 08:17:55 +000010540 ExprResult Arg1 =
10541 PerformCopyInitialization(
10542 InitializedEntity::InitializeParameter(Context,
10543 FnDecl->getParamDecl(0)),
10544 SourceLocation(), Owned(Args[1]));
Douglas Gregor4c2458a2009-12-22 21:44:34 +000010545 if (Arg1.isInvalid())
Douglas Gregor063daf62009-03-13 18:40:31 +000010546 return ExprError();
Douglas Gregor4c2458a2009-12-22 21:44:34 +000010547
John Wiegley429bb272011-04-08 18:41:53 +000010548 ExprResult Arg0 =
10549 PerformObjectArgumentInitialization(Args[0], /*Qualifier=*/0,
10550 Best->FoundDecl, Method);
10551 if (Arg0.isInvalid())
Douglas Gregor4c2458a2009-12-22 21:44:34 +000010552 return ExprError();
John Wiegley429bb272011-04-08 18:41:53 +000010553 Args[0] = Arg0.takeAs<Expr>();
Douglas Gregor4c2458a2009-12-22 21:44:34 +000010554 Args[1] = RHS = Arg1.takeAs<Expr>();
Douglas Gregor063daf62009-03-13 18:40:31 +000010555 } else {
10556 // Convert the arguments.
Chandler Carruth6df868e2010-12-12 08:17:55 +000010557 ExprResult Arg0 = PerformCopyInitialization(
10558 InitializedEntity::InitializeParameter(Context,
10559 FnDecl->getParamDecl(0)),
10560 SourceLocation(), Owned(Args[0]));
Douglas Gregor4c2458a2009-12-22 21:44:34 +000010561 if (Arg0.isInvalid())
Douglas Gregor063daf62009-03-13 18:40:31 +000010562 return ExprError();
Douglas Gregor4c2458a2009-12-22 21:44:34 +000010563
Chandler Carruth6df868e2010-12-12 08:17:55 +000010564 ExprResult Arg1 =
10565 PerformCopyInitialization(
10566 InitializedEntity::InitializeParameter(Context,
10567 FnDecl->getParamDecl(1)),
10568 SourceLocation(), Owned(Args[1]));
Douglas Gregor4c2458a2009-12-22 21:44:34 +000010569 if (Arg1.isInvalid())
10570 return ExprError();
10571 Args[0] = LHS = Arg0.takeAs<Expr>();
10572 Args[1] = RHS = Arg1.takeAs<Expr>();
Douglas Gregor063daf62009-03-13 18:40:31 +000010573 }
10574
John McCallf89e55a2010-11-18 06:31:45 +000010575 // Determine the result type.
10576 QualType ResultTy = FnDecl->getResultType();
10577 ExprValueKind VK = Expr::getValueKindForType(ResultTy);
10578 ResultTy = ResultTy.getNonLValueExprType(Context);
Douglas Gregor063daf62009-03-13 18:40:31 +000010579
10580 // Build the actual expression node.
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000010581 ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl,
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000010582 Best->FoundDecl,
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000010583 HadMultipleCandidates, OpLoc);
John Wiegley429bb272011-04-08 18:41:53 +000010584 if (FnExpr.isInvalid())
10585 return ExprError();
Douglas Gregor063daf62009-03-13 18:40:31 +000010586
John McCall9ae2f072010-08-23 23:25:46 +000010587 CXXOperatorCallExpr *TheCall =
John Wiegley429bb272011-04-08 18:41:53 +000010588 new (Context) CXXOperatorCallExpr(Context, Op, FnExpr.take(),
Lang Hamesbe9af122012-10-02 04:45:10 +000010589 Args, ResultTy, VK, OpLoc,
10590 FPFeatures.fp_contract);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010591
10592 if (CheckCallReturnType(FnDecl->getResultType(), OpLoc, TheCall,
Anders Carlsson15ea3782009-10-13 22:43:21 +000010593 FnDecl))
10594 return ExprError();
10595
Nick Lewycky9b7ea0d2013-01-24 02:03:08 +000010596 ArrayRef<const Expr *> ArgsArray(Args, 2);
10597 // Cut off the implicit 'this'.
10598 if (isa<CXXMethodDecl>(FnDecl))
10599 ArgsArray = ArgsArray.slice(1);
10600 checkCall(FnDecl, ArgsArray, 0, isa<CXXMethodDecl>(FnDecl), OpLoc,
10601 TheCall->getSourceRange(), VariadicDoesNotApply);
10602
John McCall9ae2f072010-08-23 23:25:46 +000010603 return MaybeBindToTemporary(TheCall);
Douglas Gregor063daf62009-03-13 18:40:31 +000010604 } else {
10605 // We matched a built-in operator. Convert the arguments, then
10606 // break out so that we will build the appropriate built-in
10607 // operator node.
John Wiegley429bb272011-04-08 18:41:53 +000010608 ExprResult ArgsRes0 =
10609 PerformImplicitConversion(Args[0], Best->BuiltinTypes.ParamTypes[0],
10610 Best->Conversions[0], AA_Passing);
10611 if (ArgsRes0.isInvalid())
Douglas Gregor063daf62009-03-13 18:40:31 +000010612 return ExprError();
John Wiegley429bb272011-04-08 18:41:53 +000010613 Args[0] = ArgsRes0.take();
Douglas Gregor063daf62009-03-13 18:40:31 +000010614
John Wiegley429bb272011-04-08 18:41:53 +000010615 ExprResult ArgsRes1 =
10616 PerformImplicitConversion(Args[1], Best->BuiltinTypes.ParamTypes[1],
10617 Best->Conversions[1], AA_Passing);
10618 if (ArgsRes1.isInvalid())
10619 return ExprError();
10620 Args[1] = ArgsRes1.take();
Douglas Gregor063daf62009-03-13 18:40:31 +000010621 break;
10622 }
10623 }
10624
Douglas Gregor33074752009-09-30 21:46:01 +000010625 case OR_No_Viable_Function: {
10626 // C++ [over.match.oper]p9:
10627 // If the operator is the operator , [...] and there are no
10628 // viable functions, then the operator is assumed to be the
10629 // built-in operator and interpreted according to clause 5.
John McCall2de56d12010-08-25 11:45:40 +000010630 if (Opc == BO_Comma)
Douglas Gregor33074752009-09-30 21:46:01 +000010631 break;
10632
Chandler Carruth6df868e2010-12-12 08:17:55 +000010633 // For class as left operand for assignment or compound assigment
10634 // operator do not fall through to handling in built-in, but report that
10635 // no overloaded assignment operator found
John McCall60d7b3a2010-08-24 06:29:42 +000010636 ExprResult Result = ExprError();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010637 if (Args[0]->getType()->isRecordType() &&
John McCall2de56d12010-08-25 11:45:40 +000010638 Opc >= BO_Assign && Opc <= BO_OrAssign) {
Sebastian Redl8593c782009-05-21 11:50:50 +000010639 Diag(OpLoc, diag::err_ovl_no_viable_oper)
10640 << BinaryOperator::getOpcodeStr(Opc)
Douglas Gregorc3384cb2009-08-26 17:08:25 +000010641 << Args[0]->getSourceRange() << Args[1]->getSourceRange();
Douglas Gregor33074752009-09-30 21:46:01 +000010642 } else {
Richard Smithf50e88a2011-06-05 22:42:48 +000010643 // This is an erroneous use of an operator which can be overloaded by
10644 // a non-member function. Check for non-member operators which were
10645 // defined too late to be candidates.
Ahmed Charles13a140c2012-02-25 11:00:22 +000010646 if (DiagnoseTwoPhaseOperatorLookup(*this, Op, OpLoc, Args))
Richard Smithf50e88a2011-06-05 22:42:48 +000010647 // FIXME: Recover by calling the found function.
10648 return ExprError();
10649
Douglas Gregor33074752009-09-30 21:46:01 +000010650 // No viable function; try to create a built-in operation, which will
10651 // produce an error. Then, show the non-viable candidates.
10652 Result = CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
Sebastian Redl8593c782009-05-21 11:50:50 +000010653 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010654 assert(Result.isInvalid() &&
Douglas Gregor33074752009-09-30 21:46:01 +000010655 "C++ binary operator overloading is missing candidates!");
10656 if (Result.isInvalid())
Ahmed Charles13a140c2012-02-25 11:00:22 +000010657 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args,
John McCall120d63c2010-08-24 20:38:10 +000010658 BinaryOperator::getOpcodeStr(Opc), OpLoc);
Benjamin Kramer3fe198b2012-08-23 21:35:17 +000010659 return Result;
Douglas Gregor33074752009-09-30 21:46:01 +000010660 }
Douglas Gregor063daf62009-03-13 18:40:31 +000010661
10662 case OR_Ambiguous:
Douglas Gregorae2cf762010-11-13 20:06:38 +000010663 Diag(OpLoc, diag::err_ovl_ambiguous_oper_binary)
Douglas Gregor063daf62009-03-13 18:40:31 +000010664 << BinaryOperator::getOpcodeStr(Opc)
Douglas Gregorae2cf762010-11-13 20:06:38 +000010665 << Args[0]->getType() << Args[1]->getType()
Douglas Gregorc3384cb2009-08-26 17:08:25 +000010666 << Args[0]->getSourceRange() << Args[1]->getSourceRange();
Ahmed Charles13a140c2012-02-25 11:00:22 +000010667 CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, Args,
John McCall120d63c2010-08-24 20:38:10 +000010668 BinaryOperator::getOpcodeStr(Opc), OpLoc);
Douglas Gregor063daf62009-03-13 18:40:31 +000010669 return ExprError();
10670
10671 case OR_Deleted:
Douglas Gregore4e68d42012-02-15 19:33:52 +000010672 if (isImplicitlyDeleted(Best->Function)) {
10673 CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
10674 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
Richard Smith0f46e642012-12-28 12:23:24 +000010675 << Context.getRecordType(Method->getParent())
10676 << getSpecialMember(Method);
Richard Smith5bdaac52012-04-02 20:59:25 +000010677
Richard Smith0f46e642012-12-28 12:23:24 +000010678 // The user probably meant to call this special member. Just
10679 // explain why it's deleted.
10680 NoteDeletedFunction(Method);
10681 return ExprError();
Douglas Gregore4e68d42012-02-15 19:33:52 +000010682 } else {
10683 Diag(OpLoc, diag::err_ovl_deleted_oper)
10684 << Best->Function->isDeleted()
10685 << BinaryOperator::getOpcodeStr(Opc)
10686 << getDeletedOrUnavailableSuffix(Best->Function)
10687 << Args[0]->getSourceRange() << Args[1]->getSourceRange();
10688 }
Ahmed Charles13a140c2012-02-25 11:00:22 +000010689 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args,
Eli Friedman1795d372011-08-26 19:46:22 +000010690 BinaryOperator::getOpcodeStr(Opc), OpLoc);
Douglas Gregor063daf62009-03-13 18:40:31 +000010691 return ExprError();
John McCall1d318332010-01-12 00:44:57 +000010692 }
Douglas Gregor063daf62009-03-13 18:40:31 +000010693
Douglas Gregor33074752009-09-30 21:46:01 +000010694 // We matched a built-in operator; build it.
Douglas Gregorc3384cb2009-08-26 17:08:25 +000010695 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
Douglas Gregor063daf62009-03-13 18:40:31 +000010696}
10697
John McCall60d7b3a2010-08-24 06:29:42 +000010698ExprResult
Sebastian Redlf322ed62009-10-29 20:17:01 +000010699Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc,
10700 SourceLocation RLoc,
John McCall9ae2f072010-08-23 23:25:46 +000010701 Expr *Base, Expr *Idx) {
10702 Expr *Args[2] = { Base, Idx };
Sebastian Redlf322ed62009-10-29 20:17:01 +000010703 DeclarationName OpName =
10704 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
10705
10706 // If either side is type-dependent, create an appropriate dependent
10707 // expression.
10708 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
10709
John McCallc373d482010-01-27 01:50:18 +000010710 CXXRecordDecl *NamingClass = 0; // because lookup ignores member operators
Abramo Bagnara25777432010-08-11 22:01:17 +000010711 // CHECKME: no 'operator' keyword?
10712 DeclarationNameInfo OpNameInfo(OpName, LLoc);
10713 OpNameInfo.setCXXOperatorNameRange(SourceRange(LLoc, RLoc));
John McCallba135432009-11-21 08:51:07 +000010714 UnresolvedLookupExpr *Fn
Douglas Gregorbebbe0d2010-12-15 01:34:56 +000010715 = UnresolvedLookupExpr::Create(Context, NamingClass,
Douglas Gregor4c9be892011-02-28 20:01:57 +000010716 NestedNameSpecifierLoc(), OpNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +000010717 /*ADL*/ true, /*Overloaded*/ false,
10718 UnresolvedSetIterator(),
10719 UnresolvedSetIterator());
John McCallf7a1a742009-11-24 19:00:30 +000010720 // Can't add any actual overloads yet
Sebastian Redlf322ed62009-10-29 20:17:01 +000010721
Sebastian Redlf322ed62009-10-29 20:17:01 +000010722 return Owned(new (Context) CXXOperatorCallExpr(Context, OO_Subscript, Fn,
Benjamin Kramer3b6bef92012-08-24 11:54:20 +000010723 Args,
Sebastian Redlf322ed62009-10-29 20:17:01 +000010724 Context.DependentTy,
John McCallf89e55a2010-11-18 06:31:45 +000010725 VK_RValue,
Lang Hamesbe9af122012-10-02 04:45:10 +000010726 RLoc, false));
Sebastian Redlf322ed62009-10-29 20:17:01 +000010727 }
10728
John McCall5acb0c92011-10-17 18:40:02 +000010729 // Handle placeholders on both operands.
10730 if (checkPlaceholderForOverload(*this, Args[0]))
10731 return ExprError();
10732 if (checkPlaceholderForOverload(*this, Args[1]))
10733 return ExprError();
John McCall0e800c92010-12-04 08:14:53 +000010734
Sebastian Redlf322ed62009-10-29 20:17:01 +000010735 // Build an empty overload set.
John McCall5769d612010-02-08 23:07:23 +000010736 OverloadCandidateSet CandidateSet(LLoc);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010737
10738 // Subscript can only be overloaded as a member function.
10739
10740 // Add operator candidates that are member functions.
Richard Smith958ba642013-05-05 15:51:06 +000010741 AddMemberOperatorCandidates(OO_Subscript, LLoc, Args, CandidateSet);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010742
10743 // Add builtin operator candidates.
Richard Smith958ba642013-05-05 15:51:06 +000010744 AddBuiltinOperatorCandidates(OO_Subscript, LLoc, Args, CandidateSet);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010745
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000010746 bool HadMultipleCandidates = (CandidateSet.size() > 1);
10747
Sebastian Redlf322ed62009-10-29 20:17:01 +000010748 // Perform overload resolution.
10749 OverloadCandidateSet::iterator Best;
John McCall120d63c2010-08-24 20:38:10 +000010750 switch (CandidateSet.BestViableFunction(*this, LLoc, Best)) {
Sebastian Redlf322ed62009-10-29 20:17:01 +000010751 case OR_Success: {
10752 // We found a built-in operator or an overloaded operator.
10753 FunctionDecl *FnDecl = Best->Function;
10754
10755 if (FnDecl) {
10756 // We matched an overloaded operator. Build a call to that
10757 // operator.
10758
John McCall9aa472c2010-03-19 07:35:19 +000010759 CheckMemberOperatorAccess(LLoc, Args[0], Args[1], Best->FoundDecl);
John McCallc373d482010-01-27 01:50:18 +000010760
Sebastian Redlf322ed62009-10-29 20:17:01 +000010761 // Convert the arguments.
10762 CXXMethodDecl *Method = cast<CXXMethodDecl>(FnDecl);
John Wiegley429bb272011-04-08 18:41:53 +000010763 ExprResult Arg0 =
10764 PerformObjectArgumentInitialization(Args[0], /*Qualifier=*/0,
10765 Best->FoundDecl, Method);
10766 if (Arg0.isInvalid())
Sebastian Redlf322ed62009-10-29 20:17:01 +000010767 return ExprError();
John Wiegley429bb272011-04-08 18:41:53 +000010768 Args[0] = Arg0.take();
Sebastian Redlf322ed62009-10-29 20:17:01 +000010769
Anders Carlsson38f88ab2010-01-29 18:37:50 +000010770 // Convert the arguments.
John McCall60d7b3a2010-08-24 06:29:42 +000010771 ExprResult InputInit
Anders Carlsson38f88ab2010-01-29 18:37:50 +000010772 = PerformCopyInitialization(InitializedEntity::InitializeParameter(
Fariborz Jahanian745da3a2010-09-24 17:30:16 +000010773 Context,
Anders Carlsson38f88ab2010-01-29 18:37:50 +000010774 FnDecl->getParamDecl(0)),
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010775 SourceLocation(),
Anders Carlsson38f88ab2010-01-29 18:37:50 +000010776 Owned(Args[1]));
10777 if (InputInit.isInvalid())
10778 return ExprError();
10779
10780 Args[1] = InputInit.takeAs<Expr>();
10781
Sebastian Redlf322ed62009-10-29 20:17:01 +000010782 // Determine the result type
John McCallf89e55a2010-11-18 06:31:45 +000010783 QualType ResultTy = FnDecl->getResultType();
10784 ExprValueKind VK = Expr::getValueKindForType(ResultTy);
10785 ResultTy = ResultTy.getNonLValueExprType(Context);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010786
10787 // Build the actual expression node.
Argyrios Kyrtzidis46e75472012-02-08 01:21:13 +000010788 DeclarationNameInfo OpLocInfo(OpName, LLoc);
10789 OpLocInfo.setCXXOperatorNameRange(SourceRange(LLoc, RLoc));
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000010790 ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl,
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000010791 Best->FoundDecl,
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000010792 HadMultipleCandidates,
Argyrios Kyrtzidis46e75472012-02-08 01:21:13 +000010793 OpLocInfo.getLoc(),
10794 OpLocInfo.getInfo());
John Wiegley429bb272011-04-08 18:41:53 +000010795 if (FnExpr.isInvalid())
10796 return ExprError();
Sebastian Redlf322ed62009-10-29 20:17:01 +000010797
John McCall9ae2f072010-08-23 23:25:46 +000010798 CXXOperatorCallExpr *TheCall =
10799 new (Context) CXXOperatorCallExpr(Context, OO_Subscript,
Benjamin Kramer3b6bef92012-08-24 11:54:20 +000010800 FnExpr.take(), Args,
Lang Hamesbe9af122012-10-02 04:45:10 +000010801 ResultTy, VK, RLoc,
10802 false);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010803
John McCall9ae2f072010-08-23 23:25:46 +000010804 if (CheckCallReturnType(FnDecl->getResultType(), LLoc, TheCall,
Sebastian Redlf322ed62009-10-29 20:17:01 +000010805 FnDecl))
10806 return ExprError();
10807
John McCall9ae2f072010-08-23 23:25:46 +000010808 return MaybeBindToTemporary(TheCall);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010809 } else {
10810 // We matched a built-in operator. Convert the arguments, then
10811 // break out so that we will build the appropriate built-in
10812 // operator node.
John Wiegley429bb272011-04-08 18:41:53 +000010813 ExprResult ArgsRes0 =
10814 PerformImplicitConversion(Args[0], Best->BuiltinTypes.ParamTypes[0],
10815 Best->Conversions[0], AA_Passing);
10816 if (ArgsRes0.isInvalid())
Sebastian Redlf322ed62009-10-29 20:17:01 +000010817 return ExprError();
John Wiegley429bb272011-04-08 18:41:53 +000010818 Args[0] = ArgsRes0.take();
10819
10820 ExprResult ArgsRes1 =
10821 PerformImplicitConversion(Args[1], Best->BuiltinTypes.ParamTypes[1],
10822 Best->Conversions[1], AA_Passing);
10823 if (ArgsRes1.isInvalid())
10824 return ExprError();
10825 Args[1] = ArgsRes1.take();
Sebastian Redlf322ed62009-10-29 20:17:01 +000010826
10827 break;
10828 }
10829 }
10830
10831 case OR_No_Viable_Function: {
John McCall1eb3e102010-01-07 02:04:15 +000010832 if (CandidateSet.empty())
10833 Diag(LLoc, diag::err_ovl_no_oper)
10834 << Args[0]->getType() << /*subscript*/ 0
10835 << Args[0]->getSourceRange() << Args[1]->getSourceRange();
10836 else
10837 Diag(LLoc, diag::err_ovl_no_viable_subscript)
10838 << Args[0]->getType()
10839 << Args[0]->getSourceRange() << Args[1]->getSourceRange();
Ahmed Charles13a140c2012-02-25 11:00:22 +000010840 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args,
John McCall120d63c2010-08-24 20:38:10 +000010841 "[]", LLoc);
John McCall1eb3e102010-01-07 02:04:15 +000010842 return ExprError();
Sebastian Redlf322ed62009-10-29 20:17:01 +000010843 }
10844
10845 case OR_Ambiguous:
Douglas Gregorae2cf762010-11-13 20:06:38 +000010846 Diag(LLoc, diag::err_ovl_ambiguous_oper_binary)
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010847 << "[]"
Douglas Gregorae2cf762010-11-13 20:06:38 +000010848 << Args[0]->getType() << Args[1]->getType()
10849 << Args[0]->getSourceRange() << Args[1]->getSourceRange();
Ahmed Charles13a140c2012-02-25 11:00:22 +000010850 CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, Args,
John McCall120d63c2010-08-24 20:38:10 +000010851 "[]", LLoc);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010852 return ExprError();
10853
10854 case OR_Deleted:
10855 Diag(LLoc, diag::err_ovl_deleted_oper)
10856 << Best->Function->isDeleted() << "[]"
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000010857 << getDeletedOrUnavailableSuffix(Best->Function)
Sebastian Redlf322ed62009-10-29 20:17:01 +000010858 << Args[0]->getSourceRange() << Args[1]->getSourceRange();
Ahmed Charles13a140c2012-02-25 11:00:22 +000010859 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args,
John McCall120d63c2010-08-24 20:38:10 +000010860 "[]", LLoc);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010861 return ExprError();
10862 }
10863
10864 // We matched a built-in operator; build it.
John McCall9ae2f072010-08-23 23:25:46 +000010865 return CreateBuiltinArraySubscriptExpr(Args[0], LLoc, Args[1], RLoc);
Sebastian Redlf322ed62009-10-29 20:17:01 +000010866}
10867
Douglas Gregor88a35142008-12-22 05:46:06 +000010868/// BuildCallToMemberFunction - Build a call to a member
10869/// function. MemExpr is the expression that refers to the member
10870/// function (and includes the object parameter), Args/NumArgs are the
10871/// arguments to the function call (not including the object
10872/// parameter). The caller needs to validate that the member
John McCall864c0412011-04-26 20:42:42 +000010873/// expression refers to a non-static member function or an overloaded
10874/// member function.
John McCall60d7b3a2010-08-24 06:29:42 +000010875ExprResult
Mike Stump1eb44332009-09-09 15:08:12 +000010876Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE,
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010877 SourceLocation LParenLoc,
10878 MultiExprArg Args,
10879 SourceLocation RParenLoc) {
John McCall864c0412011-04-26 20:42:42 +000010880 assert(MemExprE->getType() == Context.BoundMemberTy ||
10881 MemExprE->getType() == Context.OverloadTy);
10882
Douglas Gregor88a35142008-12-22 05:46:06 +000010883 // Dig out the member expression. This holds both the object
10884 // argument and the member function we're referring to.
John McCall129e2df2009-11-30 22:42:35 +000010885 Expr *NakedMemExpr = MemExprE->IgnoreParens();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010886
John McCall864c0412011-04-26 20:42:42 +000010887 // Determine whether this is a call to a pointer-to-member function.
10888 if (BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
10889 assert(op->getType() == Context.BoundMemberTy);
10890 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
10891
10892 QualType fnType =
10893 op->getRHS()->getType()->castAs<MemberPointerType>()->getPointeeType();
10894
10895 const FunctionProtoType *proto = fnType->castAs<FunctionProtoType>();
10896 QualType resultType = proto->getCallResultType(Context);
10897 ExprValueKind valueKind = Expr::getValueKindForType(proto->getResultType());
10898
10899 // Check that the object type isn't more qualified than the
10900 // member function we're calling.
10901 Qualifiers funcQuals = Qualifiers::fromCVRMask(proto->getTypeQuals());
10902
10903 QualType objectType = op->getLHS()->getType();
10904 if (op->getOpcode() == BO_PtrMemI)
10905 objectType = objectType->castAs<PointerType>()->getPointeeType();
10906 Qualifiers objectQuals = objectType.getQualifiers();
10907
10908 Qualifiers difference = objectQuals - funcQuals;
10909 difference.removeObjCGCAttr();
10910 difference.removeAddressSpace();
10911 if (difference) {
10912 std::string qualsString = difference.getAsString();
10913 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
10914 << fnType.getUnqualifiedType()
10915 << qualsString
10916 << (qualsString.find(' ') == std::string::npos ? 1 : 2);
10917 }
10918
10919 CXXMemberCallExpr *call
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010920 = new (Context) CXXMemberCallExpr(Context, MemExprE, Args,
John McCall864c0412011-04-26 20:42:42 +000010921 resultType, valueKind, RParenLoc);
10922
10923 if (CheckCallReturnType(proto->getResultType(),
Daniel Dunbar96a00142012-03-09 18:35:03 +000010924 op->getRHS()->getLocStart(),
John McCall864c0412011-04-26 20:42:42 +000010925 call, 0))
10926 return ExprError();
10927
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010928 if (ConvertArgumentsForCall(call, op, 0, proto, Args, RParenLoc))
John McCall864c0412011-04-26 20:42:42 +000010929 return ExprError();
10930
10931 return MaybeBindToTemporary(call);
10932 }
10933
John McCall5acb0c92011-10-17 18:40:02 +000010934 UnbridgedCastsSet UnbridgedCasts;
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010935 if (checkArgPlaceholdersForOverload(*this, Args, UnbridgedCasts))
John McCall5acb0c92011-10-17 18:40:02 +000010936 return ExprError();
10937
John McCall129e2df2009-11-30 22:42:35 +000010938 MemberExpr *MemExpr;
Douglas Gregor88a35142008-12-22 05:46:06 +000010939 CXXMethodDecl *Method = 0;
John McCallbb6fb462010-04-08 00:13:37 +000010940 DeclAccessPair FoundDecl = DeclAccessPair::make(0, AS_public);
Douglas Gregor5fccd362010-03-03 23:55:11 +000010941 NestedNameSpecifier *Qualifier = 0;
John McCall129e2df2009-11-30 22:42:35 +000010942 if (isa<MemberExpr>(NakedMemExpr)) {
10943 MemExpr = cast<MemberExpr>(NakedMemExpr);
John McCall129e2df2009-11-30 22:42:35 +000010944 Method = cast<CXXMethodDecl>(MemExpr->getMemberDecl());
John McCall6bb80172010-03-30 21:47:33 +000010945 FoundDecl = MemExpr->getFoundDecl();
Douglas Gregor5fccd362010-03-03 23:55:11 +000010946 Qualifier = MemExpr->getQualifier();
John McCall5acb0c92011-10-17 18:40:02 +000010947 UnbridgedCasts.restore();
John McCall129e2df2009-11-30 22:42:35 +000010948 } else {
10949 UnresolvedMemberExpr *UnresExpr = cast<UnresolvedMemberExpr>(NakedMemExpr);
Douglas Gregor5fccd362010-03-03 23:55:11 +000010950 Qualifier = UnresExpr->getQualifier();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010951
John McCall701c89e2009-12-03 04:06:58 +000010952 QualType ObjectType = UnresExpr->getBaseType();
Douglas Gregor2c9a03f2011-01-26 19:30:28 +000010953 Expr::Classification ObjectClassification
10954 = UnresExpr->isArrow()? Expr::Classification::makeSimpleLValue()
10955 : UnresExpr->getBase()->Classify(Context);
John McCall129e2df2009-11-30 22:42:35 +000010956
Douglas Gregor88a35142008-12-22 05:46:06 +000010957 // Add overload candidates
John McCall5769d612010-02-08 23:07:23 +000010958 OverloadCandidateSet CandidateSet(UnresExpr->getMemberLoc());
Mike Stump1eb44332009-09-09 15:08:12 +000010959
John McCallaa81e162009-12-01 22:10:20 +000010960 // FIXME: avoid copy.
10961 TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = 0;
10962 if (UnresExpr->hasExplicitTemplateArgs()) {
10963 UnresExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
10964 TemplateArgs = &TemplateArgsBuffer;
10965 }
10966
John McCall129e2df2009-11-30 22:42:35 +000010967 for (UnresolvedMemberExpr::decls_iterator I = UnresExpr->decls_begin(),
10968 E = UnresExpr->decls_end(); I != E; ++I) {
10969
John McCall701c89e2009-12-03 04:06:58 +000010970 NamedDecl *Func = *I;
10971 CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(Func->getDeclContext());
10972 if (isa<UsingShadowDecl>(Func))
10973 Func = cast<UsingShadowDecl>(Func)->getTargetDecl();
10974
Douglas Gregor2c9a03f2011-01-26 19:30:28 +000010975
Francois Pichetdbee3412011-01-18 05:04:39 +000010976 // Microsoft supports direct constructor calls.
David Blaikie4e4d0842012-03-11 07:00:24 +000010977 if (getLangOpts().MicrosoftExt && isa<CXXConstructorDecl>(Func)) {
Ahmed Charles13a140c2012-02-25 11:00:22 +000010978 AddOverloadCandidate(cast<CXXConstructorDecl>(Func), I.getPair(),
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010979 Args, CandidateSet);
Francois Pichetdbee3412011-01-18 05:04:39 +000010980 } else if ((Method = dyn_cast<CXXMethodDecl>(Func))) {
Douglas Gregor3eefb1c2009-10-24 04:59:53 +000010981 // If explicit template arguments were provided, we can't call a
10982 // non-template member function.
John McCallaa81e162009-12-01 22:10:20 +000010983 if (TemplateArgs)
Douglas Gregor3eefb1c2009-10-24 04:59:53 +000010984 continue;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010985
John McCall9aa472c2010-03-19 07:35:19 +000010986 AddMethodCandidate(Method, I.getPair(), ActingDC, ObjectType,
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010987 ObjectClassification, Args, CandidateSet,
Douglas Gregor2c9a03f2011-01-26 19:30:28 +000010988 /*SuppressUserConversions=*/false);
John McCalld5532b62009-11-23 01:53:49 +000010989 } else {
John McCall129e2df2009-11-30 22:42:35 +000010990 AddMethodTemplateCandidate(cast<FunctionTemplateDecl>(Func),
John McCall9aa472c2010-03-19 07:35:19 +000010991 I.getPair(), ActingDC, TemplateArgs,
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000010992 ObjectType, ObjectClassification,
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000010993 Args, CandidateSet,
Douglas Gregordec06662009-08-21 18:42:58 +000010994 /*SuppressUsedConversions=*/false);
John McCalld5532b62009-11-23 01:53:49 +000010995 }
Douglas Gregordec06662009-08-21 18:42:58 +000010996 }
Mike Stump1eb44332009-09-09 15:08:12 +000010997
John McCall129e2df2009-11-30 22:42:35 +000010998 DeclarationName DeclName = UnresExpr->getMemberName();
10999
John McCall5acb0c92011-10-17 18:40:02 +000011000 UnbridgedCasts.restore();
11001
Douglas Gregor88a35142008-12-22 05:46:06 +000011002 OverloadCandidateSet::iterator Best;
John McCall120d63c2010-08-24 20:38:10 +000011003 switch (CandidateSet.BestViableFunction(*this, UnresExpr->getLocStart(),
Nick Lewycky7663f392010-11-20 01:29:55 +000011004 Best)) {
Douglas Gregor88a35142008-12-22 05:46:06 +000011005 case OR_Success:
11006 Method = cast<CXXMethodDecl>(Best->Function);
John McCall6bb80172010-03-30 21:47:33 +000011007 FoundDecl = Best->FoundDecl;
John McCall9aa472c2010-03-19 07:35:19 +000011008 CheckUnresolvedMemberAccess(UnresExpr, Best->FoundDecl);
Richard Smith82f145d2013-05-04 06:44:46 +000011009 if (DiagnoseUseOfDecl(Best->FoundDecl, UnresExpr->getNameLoc()))
11010 return ExprError();
Faisal Valid570a922013-06-15 11:54:37 +000011011 // If FoundDecl is different from Method (such as if one is a template
11012 // and the other a specialization), make sure DiagnoseUseOfDecl is
11013 // called on both.
11014 // FIXME: This would be more comprehensively addressed by modifying
11015 // DiagnoseUseOfDecl to accept both the FoundDecl and the decl
11016 // being used.
11017 if (Method != FoundDecl.getDecl() &&
11018 DiagnoseUseOfDecl(Method, UnresExpr->getNameLoc()))
11019 return ExprError();
Douglas Gregor88a35142008-12-22 05:46:06 +000011020 break;
11021
11022 case OR_No_Viable_Function:
John McCall129e2df2009-11-30 22:42:35 +000011023 Diag(UnresExpr->getMemberLoc(),
Douglas Gregor88a35142008-12-22 05:46:06 +000011024 diag::err_ovl_no_viable_member_function_in_call)
Douglas Gregor6b906862009-08-21 00:16:32 +000011025 << DeclName << MemExprE->getSourceRange();
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011026 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args);
Douglas Gregor88a35142008-12-22 05:46:06 +000011027 // FIXME: Leaking incoming expressions!
John McCallaa81e162009-12-01 22:10:20 +000011028 return ExprError();
Douglas Gregor88a35142008-12-22 05:46:06 +000011029
11030 case OR_Ambiguous:
John McCall129e2df2009-11-30 22:42:35 +000011031 Diag(UnresExpr->getMemberLoc(), diag::err_ovl_ambiguous_member_call)
Douglas Gregor6b906862009-08-21 00:16:32 +000011032 << DeclName << MemExprE->getSourceRange();
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011033 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args);
Douglas Gregor88a35142008-12-22 05:46:06 +000011034 // FIXME: Leaking incoming expressions!
John McCallaa81e162009-12-01 22:10:20 +000011035 return ExprError();
Douglas Gregor48f3bb92009-02-18 21:56:37 +000011036
11037 case OR_Deleted:
John McCall129e2df2009-11-30 22:42:35 +000011038 Diag(UnresExpr->getMemberLoc(), diag::err_ovl_deleted_member_call)
Douglas Gregor48f3bb92009-02-18 21:56:37 +000011039 << Best->Function->isDeleted()
Fariborz Jahanian5e24f2a2011-02-25 20:51:14 +000011040 << DeclName
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000011041 << getDeletedOrUnavailableSuffix(Best->Function)
Fariborz Jahanian5e24f2a2011-02-25 20:51:14 +000011042 << MemExprE->getSourceRange();
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011043 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args);
Douglas Gregor48f3bb92009-02-18 21:56:37 +000011044 // FIXME: Leaking incoming expressions!
John McCallaa81e162009-12-01 22:10:20 +000011045 return ExprError();
Douglas Gregor88a35142008-12-22 05:46:06 +000011046 }
11047
John McCall6bb80172010-03-30 21:47:33 +000011048 MemExprE = FixOverloadedFunctionReference(MemExprE, FoundDecl, Method);
John McCallaa81e162009-12-01 22:10:20 +000011049
John McCallaa81e162009-12-01 22:10:20 +000011050 // If overload resolution picked a static member, build a
11051 // non-member call based on that function.
11052 if (Method->isStatic()) {
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011053 return BuildResolvedCallExpr(MemExprE, Method, LParenLoc, Args,
11054 RParenLoc);
John McCallaa81e162009-12-01 22:10:20 +000011055 }
11056
John McCall129e2df2009-11-30 22:42:35 +000011057 MemExpr = cast<MemberExpr>(MemExprE->IgnoreParens());
Douglas Gregor88a35142008-12-22 05:46:06 +000011058 }
11059
John McCallf89e55a2010-11-18 06:31:45 +000011060 QualType ResultType = Method->getResultType();
11061 ExprValueKind VK = Expr::getValueKindForType(ResultType);
11062 ResultType = ResultType.getNonLValueExprType(Context);
11063
Douglas Gregor88a35142008-12-22 05:46:06 +000011064 assert(Method && "Member call to something that isn't a method?");
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011065 CXXMemberCallExpr *TheCall =
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011066 new (Context) CXXMemberCallExpr(Context, MemExprE, Args,
John McCallf89e55a2010-11-18 06:31:45 +000011067 ResultType, VK, RParenLoc);
Douglas Gregor88a35142008-12-22 05:46:06 +000011068
Anders Carlssoneed3e692009-10-10 00:06:20 +000011069 // Check for a valid return type.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011070 if (CheckCallReturnType(Method->getResultType(), MemExpr->getMemberLoc(),
John McCall9ae2f072010-08-23 23:25:46 +000011071 TheCall, Method))
John McCallaa81e162009-12-01 22:10:20 +000011072 return ExprError();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011073
Douglas Gregor88a35142008-12-22 05:46:06 +000011074 // Convert the object argument (for a non-static member function call).
John McCall6bb80172010-03-30 21:47:33 +000011075 // We only need to do this if there was actually an overload; otherwise
11076 // it was done at lookup.
John Wiegley429bb272011-04-08 18:41:53 +000011077 if (!Method->isStatic()) {
11078 ExprResult ObjectArg =
11079 PerformObjectArgumentInitialization(MemExpr->getBase(), Qualifier,
11080 FoundDecl, Method);
11081 if (ObjectArg.isInvalid())
11082 return ExprError();
11083 MemExpr->setBase(ObjectArg.take());
11084 }
Douglas Gregor88a35142008-12-22 05:46:06 +000011085
11086 // Convert the rest of the arguments
Chandler Carruth6df868e2010-12-12 08:17:55 +000011087 const FunctionProtoType *Proto =
11088 Method->getType()->getAs<FunctionProtoType>();
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011089 if (ConvertArgumentsForCall(TheCall, MemExpr, Method, Proto, Args,
Douglas Gregor88a35142008-12-22 05:46:06 +000011090 RParenLoc))
John McCallaa81e162009-12-01 22:10:20 +000011091 return ExprError();
Douglas Gregor88a35142008-12-22 05:46:06 +000011092
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011093 DiagnoseSentinelCalls(Method, LParenLoc, Args);
Eli Friedmane61eb042012-02-18 04:48:30 +000011094
Richard Smith831421f2012-06-25 20:30:08 +000011095 if (CheckFunctionCall(Method, TheCall, Proto))
John McCallaa81e162009-12-01 22:10:20 +000011096 return ExprError();
Anders Carlsson6f680272009-08-16 03:42:12 +000011097
Anders Carlsson2174d4c2011-05-06 14:25:31 +000011098 if ((isa<CXXConstructorDecl>(CurContext) ||
11099 isa<CXXDestructorDecl>(CurContext)) &&
11100 TheCall->getMethodDecl()->isPure()) {
11101 const CXXMethodDecl *MD = TheCall->getMethodDecl();
11102
Chandler Carruthae198062011-06-27 08:31:58 +000011103 if (isa<CXXThisExpr>(MemExpr->getBase()->IgnoreParenCasts())) {
Anders Carlsson2174d4c2011-05-06 14:25:31 +000011104 Diag(MemExpr->getLocStart(),
11105 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
11106 << MD->getDeclName() << isa<CXXDestructorDecl>(CurContext)
11107 << MD->getParent()->getDeclName();
11108
11109 Diag(MD->getLocStart(), diag::note_previous_decl) << MD->getDeclName();
Chandler Carruthae198062011-06-27 08:31:58 +000011110 }
Anders Carlsson2174d4c2011-05-06 14:25:31 +000011111 }
John McCall9ae2f072010-08-23 23:25:46 +000011112 return MaybeBindToTemporary(TheCall);
Douglas Gregor88a35142008-12-22 05:46:06 +000011113}
11114
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011115/// BuildCallToObjectOfClassType - Build a call to an object of class
11116/// type (C++ [over.call.object]), which can end up invoking an
11117/// overloaded function call operator (@c operator()) or performing a
11118/// user-defined conversion on the object argument.
John McCallf312b1e2010-08-26 23:41:50 +000011119ExprResult
John Wiegley429bb272011-04-08 18:41:53 +000011120Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj,
Douglas Gregor5c37de72008-12-06 00:22:45 +000011121 SourceLocation LParenLoc,
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011122 MultiExprArg Args,
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011123 SourceLocation RParenLoc) {
John McCall5acb0c92011-10-17 18:40:02 +000011124 if (checkPlaceholderForOverload(*this, Obj))
11125 return ExprError();
John Wiegley429bb272011-04-08 18:41:53 +000011126 ExprResult Object = Owned(Obj);
John McCall5acb0c92011-10-17 18:40:02 +000011127
11128 UnbridgedCastsSet UnbridgedCasts;
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011129 if (checkArgPlaceholdersForOverload(*this, Args, UnbridgedCasts))
John McCall5acb0c92011-10-17 18:40:02 +000011130 return ExprError();
John McCall0e800c92010-12-04 08:14:53 +000011131
John Wiegley429bb272011-04-08 18:41:53 +000011132 assert(Object.get()->getType()->isRecordType() && "Requires object type argument");
11133 const RecordType *Record = Object.get()->getType()->getAs<RecordType>();
Mike Stump1eb44332009-09-09 15:08:12 +000011134
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011135 // C++ [over.call.object]p1:
11136 // If the primary-expression E in the function call syntax
Eli Friedman33a31382009-08-05 19:21:58 +000011137 // evaluates to a class object of type "cv T", then the set of
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011138 // candidate functions includes at least the function call
11139 // operators of T. The function call operators of T are obtained by
11140 // ordinary lookup of the name operator() in the context of
11141 // (E).operator().
John McCall5769d612010-02-08 23:07:23 +000011142 OverloadCandidateSet CandidateSet(LParenLoc);
Douglas Gregor44b43212008-12-11 16:49:14 +000011143 DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(OO_Call);
Douglas Gregor593564b2009-11-15 07:48:03 +000011144
John Wiegley429bb272011-04-08 18:41:53 +000011145 if (RequireCompleteType(LParenLoc, Object.get()->getType(),
Douglas Gregord10099e2012-05-04 16:32:21 +000011146 diag::err_incomplete_object_call, Object.get()))
Douglas Gregor593564b2009-11-15 07:48:03 +000011147 return true;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011148
John McCalla24dc2e2009-11-17 02:14:36 +000011149 LookupResult R(*this, OpName, LParenLoc, LookupOrdinaryName);
11150 LookupQualifiedName(R, Record->getDecl());
11151 R.suppressDiagnostics();
11152
Douglas Gregor593564b2009-11-15 07:48:03 +000011153 for (LookupResult::iterator Oper = R.begin(), OperEnd = R.end();
Douglas Gregor3734c212009-11-07 17:23:56 +000011154 Oper != OperEnd; ++Oper) {
John Wiegley429bb272011-04-08 18:41:53 +000011155 AddMethodCandidate(Oper.getPair(), Object.get()->getType(),
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011156 Object.get()->Classify(Context),
11157 Args, CandidateSet,
John McCall314be4e2009-11-17 07:50:12 +000011158 /*SuppressUserConversions=*/ false);
Douglas Gregor3734c212009-11-07 17:23:56 +000011159 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011160
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011161 // C++ [over.call.object]p2:
Douglas Gregorbf6e3172011-07-23 18:59:35 +000011162 // In addition, for each (non-explicit in C++0x) conversion function
11163 // declared in T of the form
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011164 //
11165 // operator conversion-type-id () cv-qualifier;
11166 //
11167 // where cv-qualifier is the same cv-qualification as, or a
11168 // greater cv-qualification than, cv, and where conversion-type-id
Douglas Gregora967a6f2008-11-20 13:33:37 +000011169 // denotes the type "pointer to function of (P1,...,Pn) returning
11170 // R", or the type "reference to pointer to function of
11171 // (P1,...,Pn) returning R", or the type "reference to function
11172 // of (P1,...,Pn) returning R", a surrogate call function [...]
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011173 // is also considered as a candidate function. Similarly,
11174 // surrogate call functions are added to the set of candidate
11175 // functions for each conversion function declared in an
11176 // accessible base class provided the function is not hidden
11177 // within T by another intervening declaration.
Argyrios Kyrtzidis9d295432012-11-28 03:56:09 +000011178 std::pair<CXXRecordDecl::conversion_iterator,
11179 CXXRecordDecl::conversion_iterator> Conversions
Douglas Gregor90073282010-01-11 19:36:35 +000011180 = cast<CXXRecordDecl>(Record->getDecl())->getVisibleConversionFunctions();
Argyrios Kyrtzidis9d295432012-11-28 03:56:09 +000011181 for (CXXRecordDecl::conversion_iterator
11182 I = Conversions.first, E = Conversions.second; I != E; ++I) {
John McCall701c89e2009-12-03 04:06:58 +000011183 NamedDecl *D = *I;
11184 CXXRecordDecl *ActingContext = cast<CXXRecordDecl>(D->getDeclContext());
11185 if (isa<UsingShadowDecl>(D))
11186 D = cast<UsingShadowDecl>(D)->getTargetDecl();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011187
Douglas Gregor4a27d702009-10-21 06:18:39 +000011188 // Skip over templated conversion functions; they aren't
11189 // surrogates.
John McCall701c89e2009-12-03 04:06:58 +000011190 if (isa<FunctionTemplateDecl>(D))
Douglas Gregor4a27d702009-10-21 06:18:39 +000011191 continue;
Douglas Gregor65ec1fd2009-08-21 23:19:43 +000011192
John McCall701c89e2009-12-03 04:06:58 +000011193 CXXConversionDecl *Conv = cast<CXXConversionDecl>(D);
Douglas Gregorbf6e3172011-07-23 18:59:35 +000011194 if (!Conv->isExplicit()) {
11195 // Strip the reference type (if any) and then the pointer type (if
11196 // any) to get down to what might be a function type.
11197 QualType ConvType = Conv->getConversionType().getNonReferenceType();
11198 if (const PointerType *ConvPtrType = ConvType->getAs<PointerType>())
11199 ConvType = ConvPtrType->getPointeeType();
John McCallba135432009-11-21 08:51:07 +000011200
Douglas Gregorbf6e3172011-07-23 18:59:35 +000011201 if (const FunctionProtoType *Proto = ConvType->getAs<FunctionProtoType>())
11202 {
11203 AddSurrogateCandidate(Conv, I.getPair(), ActingContext, Proto,
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011204 Object.get(), Args, CandidateSet);
Douglas Gregorbf6e3172011-07-23 18:59:35 +000011205 }
11206 }
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011207 }
Mike Stump1eb44332009-09-09 15:08:12 +000011208
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011209 bool HadMultipleCandidates = (CandidateSet.size() > 1);
11210
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011211 // Perform overload resolution.
11212 OverloadCandidateSet::iterator Best;
John Wiegley429bb272011-04-08 18:41:53 +000011213 switch (CandidateSet.BestViableFunction(*this, Object.get()->getLocStart(),
John McCall120d63c2010-08-24 20:38:10 +000011214 Best)) {
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011215 case OR_Success:
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011216 // Overload resolution succeeded; we'll build the appropriate call
11217 // below.
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011218 break;
11219
11220 case OR_No_Viable_Function:
John McCall1eb3e102010-01-07 02:04:15 +000011221 if (CandidateSet.empty())
Daniel Dunbar96a00142012-03-09 18:35:03 +000011222 Diag(Object.get()->getLocStart(), diag::err_ovl_no_oper)
John Wiegley429bb272011-04-08 18:41:53 +000011223 << Object.get()->getType() << /*call*/ 1
11224 << Object.get()->getSourceRange();
John McCall1eb3e102010-01-07 02:04:15 +000011225 else
Daniel Dunbar96a00142012-03-09 18:35:03 +000011226 Diag(Object.get()->getLocStart(),
John McCall1eb3e102010-01-07 02:04:15 +000011227 diag::err_ovl_no_viable_object_call)
John Wiegley429bb272011-04-08 18:41:53 +000011228 << Object.get()->getType() << Object.get()->getSourceRange();
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011229 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args);
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011230 break;
11231
11232 case OR_Ambiguous:
Daniel Dunbar96a00142012-03-09 18:35:03 +000011233 Diag(Object.get()->getLocStart(),
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011234 diag::err_ovl_ambiguous_object_call)
John Wiegley429bb272011-04-08 18:41:53 +000011235 << Object.get()->getType() << Object.get()->getSourceRange();
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011236 CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, Args);
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011237 break;
Douglas Gregor48f3bb92009-02-18 21:56:37 +000011238
11239 case OR_Deleted:
Daniel Dunbar96a00142012-03-09 18:35:03 +000011240 Diag(Object.get()->getLocStart(),
Douglas Gregor48f3bb92009-02-18 21:56:37 +000011241 diag::err_ovl_deleted_object_call)
11242 << Best->Function->isDeleted()
John Wiegley429bb272011-04-08 18:41:53 +000011243 << Object.get()->getType()
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000011244 << getDeletedOrUnavailableSuffix(Best->Function)
John Wiegley429bb272011-04-08 18:41:53 +000011245 << Object.get()->getSourceRange();
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011246 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args);
Douglas Gregor48f3bb92009-02-18 21:56:37 +000011247 break;
Mike Stump1eb44332009-09-09 15:08:12 +000011248 }
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011249
Douglas Gregorff331c12010-07-25 18:17:45 +000011250 if (Best == CandidateSet.end())
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011251 return true;
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011252
John McCall5acb0c92011-10-17 18:40:02 +000011253 UnbridgedCasts.restore();
11254
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011255 if (Best->Function == 0) {
11256 // Since there is no function declaration, this is one of the
11257 // surrogate candidates. Dig out the conversion function.
Mike Stump1eb44332009-09-09 15:08:12 +000011258 CXXConversionDecl *Conv
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011259 = cast<CXXConversionDecl>(
11260 Best->Conversions[0].UserDefined.ConversionFunction);
11261
John Wiegley429bb272011-04-08 18:41:53 +000011262 CheckMemberOperatorAccess(LParenLoc, Object.get(), 0, Best->FoundDecl);
Richard Smith82f145d2013-05-04 06:44:46 +000011263 if (DiagnoseUseOfDecl(Best->FoundDecl, LParenLoc))
11264 return ExprError();
Faisal Valid570a922013-06-15 11:54:37 +000011265 assert(Conv == Best->FoundDecl.getDecl() &&
11266 "Found Decl & conversion-to-functionptr should be same, right?!");
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011267 // We selected one of the surrogate functions that converts the
11268 // object parameter to a function pointer. Perform the conversion
11269 // on the object argument, then let ActOnCallExpr finish the job.
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011270
Fariborz Jahaniand8307b12009-09-28 18:35:46 +000011271 // Create an implicit member expr to refer to the conversion operator.
Fariborz Jahanianb7400232009-09-28 23:23:40 +000011272 // and then call it.
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011273 ExprResult Call = BuildCXXMemberCallExpr(Object.get(), Best->FoundDecl,
11274 Conv, HadMultipleCandidates);
Douglas Gregorf2ae5262011-01-20 00:18:04 +000011275 if (Call.isInvalid())
11276 return ExprError();
Abramo Bagnara960809e2011-11-16 22:46:05 +000011277 // Record usage of conversion in an implicit cast.
11278 Call = Owned(ImplicitCastExpr::Create(Context, Call.get()->getType(),
11279 CK_UserDefinedConversion,
11280 Call.get(), 0, VK_RValue));
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011281
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011282 return ActOnCallExpr(S, Call.get(), LParenLoc, Args, RParenLoc);
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011283 }
11284
John Wiegley429bb272011-04-08 18:41:53 +000011285 CheckMemberOperatorAccess(LParenLoc, Object.get(), 0, Best->FoundDecl);
John McCall41d89032010-01-28 01:54:34 +000011286
Douglas Gregor106c6eb2008-11-19 22:57:39 +000011287 // We found an overloaded operator(). Build a CXXOperatorCallExpr
11288 // that calls this method, using Object for the implicit object
11289 // parameter and passing along the remaining arguments.
11290 CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
Nico Webere0ff6902012-11-09 06:06:14 +000011291
11292 // An error diagnostic has already been printed when parsing the declaration.
Nico Weber1a52a4d2012-11-09 08:38:04 +000011293 if (Method->isInvalidDecl())
Nico Webere0ff6902012-11-09 06:06:14 +000011294 return ExprError();
11295
Chandler Carruth6df868e2010-12-12 08:17:55 +000011296 const FunctionProtoType *Proto =
11297 Method->getType()->getAs<FunctionProtoType>();
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011298
11299 unsigned NumArgsInProto = Proto->getNumArgs();
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011300 unsigned NumArgsToCheck = Args.size();
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011301
11302 // Build the full argument list for the method call (the
11303 // implicit object parameter is placed at the beginning of the
11304 // list).
11305 Expr **MethodArgs;
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011306 if (Args.size() < NumArgsInProto) {
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011307 NumArgsToCheck = NumArgsInProto;
11308 MethodArgs = new Expr*[NumArgsInProto + 1];
11309 } else {
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011310 MethodArgs = new Expr*[Args.size() + 1];
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011311 }
John Wiegley429bb272011-04-08 18:41:53 +000011312 MethodArgs[0] = Object.get();
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011313 for (unsigned ArgIdx = 0, e = Args.size(); ArgIdx != e; ++ArgIdx)
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011314 MethodArgs[ArgIdx + 1] = Args[ArgIdx];
Mike Stump1eb44332009-09-09 15:08:12 +000011315
Argyrios Kyrtzidis46e75472012-02-08 01:21:13 +000011316 DeclarationNameInfo OpLocInfo(
11317 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
11318 OpLocInfo.setCXXOperatorNameRange(SourceRange(LParenLoc, RParenLoc));
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000011319 ExprResult NewFn = CreateFunctionRefExpr(*this, Method, Best->FoundDecl,
Argyrios Kyrtzidis46e75472012-02-08 01:21:13 +000011320 HadMultipleCandidates,
11321 OpLocInfo.getLoc(),
11322 OpLocInfo.getInfo());
John Wiegley429bb272011-04-08 18:41:53 +000011323 if (NewFn.isInvalid())
11324 return true;
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011325
11326 // Once we've built TheCall, all of the expressions are properly
11327 // owned.
John McCallf89e55a2010-11-18 06:31:45 +000011328 QualType ResultTy = Method->getResultType();
11329 ExprValueKind VK = Expr::getValueKindForType(ResultTy);
11330 ResultTy = ResultTy.getNonLValueExprType(Context);
11331
John McCall9ae2f072010-08-23 23:25:46 +000011332 CXXOperatorCallExpr *TheCall =
John Wiegley429bb272011-04-08 18:41:53 +000011333 new (Context) CXXOperatorCallExpr(Context, OO_Call, NewFn.take(),
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011334 llvm::makeArrayRef(MethodArgs, Args.size()+1),
Lang Hamesbe9af122012-10-02 04:45:10 +000011335 ResultTy, VK, RParenLoc, false);
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011336 delete [] MethodArgs;
11337
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011338 if (CheckCallReturnType(Method->getResultType(), LParenLoc, TheCall,
Anders Carlsson07d68f12009-10-13 21:49:31 +000011339 Method))
11340 return true;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011341
Douglas Gregor518fda12009-01-13 05:10:00 +000011342 // We may have default arguments. If so, we need to allocate more
11343 // slots in the call for them.
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011344 if (Args.size() < NumArgsInProto)
Ted Kremenek8189cde2009-02-07 01:47:29 +000011345 TheCall->setNumArgs(Context, NumArgsInProto + 1);
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011346 else if (Args.size() > NumArgsInProto)
Douglas Gregor518fda12009-01-13 05:10:00 +000011347 NumArgsToCheck = NumArgsInProto;
11348
Chris Lattner312531a2009-04-12 08:11:20 +000011349 bool IsError = false;
11350
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011351 // Initialize the implicit object parameter.
John Wiegley429bb272011-04-08 18:41:53 +000011352 ExprResult ObjRes =
11353 PerformObjectArgumentInitialization(Object.get(), /*Qualifier=*/0,
11354 Best->FoundDecl, Method);
11355 if (ObjRes.isInvalid())
11356 IsError = true;
11357 else
Benjamin Kramer3fe198b2012-08-23 21:35:17 +000011358 Object = ObjRes;
John Wiegley429bb272011-04-08 18:41:53 +000011359 TheCall->setArg(0, Object.take());
Chris Lattner312531a2009-04-12 08:11:20 +000011360
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011361 // Check the argument types.
11362 for (unsigned i = 0; i != NumArgsToCheck; i++) {
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011363 Expr *Arg;
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011364 if (i < Args.size()) {
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011365 Arg = Args[i];
Mike Stump1eb44332009-09-09 15:08:12 +000011366
Douglas Gregor518fda12009-01-13 05:10:00 +000011367 // Pass the argument.
Anders Carlsson3faa4862010-01-29 18:43:53 +000011368
John McCall60d7b3a2010-08-24 06:29:42 +000011369 ExprResult InputInit
Anders Carlsson3faa4862010-01-29 18:43:53 +000011370 = PerformCopyInitialization(InitializedEntity::InitializeParameter(
Fariborz Jahanian745da3a2010-09-24 17:30:16 +000011371 Context,
Anders Carlsson3faa4862010-01-29 18:43:53 +000011372 Method->getParamDecl(i)),
John McCall9ae2f072010-08-23 23:25:46 +000011373 SourceLocation(), Arg);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011374
Anders Carlsson3faa4862010-01-29 18:43:53 +000011375 IsError |= InputInit.isInvalid();
11376 Arg = InputInit.takeAs<Expr>();
Douglas Gregor518fda12009-01-13 05:10:00 +000011377 } else {
John McCall60d7b3a2010-08-24 06:29:42 +000011378 ExprResult DefArg
Douglas Gregord47c47d2009-11-09 19:27:57 +000011379 = BuildCXXDefaultArgExpr(LParenLoc, Method, Method->getParamDecl(i));
11380 if (DefArg.isInvalid()) {
11381 IsError = true;
11382 break;
11383 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011384
Douglas Gregord47c47d2009-11-09 19:27:57 +000011385 Arg = DefArg.takeAs<Expr>();
Douglas Gregor518fda12009-01-13 05:10:00 +000011386 }
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011387
11388 TheCall->setArg(i + 1, Arg);
11389 }
11390
11391 // If this is a variadic call, handle args passed through "...".
11392 if (Proto->isVariadic()) {
11393 // Promote the arguments (C99 6.5.2.2p7).
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011394 for (unsigned i = NumArgsInProto, e = Args.size(); i < e; i++) {
John Wiegley429bb272011-04-08 18:41:53 +000011395 ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod, 0);
11396 IsError |= Arg.isInvalid();
11397 TheCall->setArg(i + 1, Arg.take());
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011398 }
11399 }
11400
Chris Lattner312531a2009-04-12 08:11:20 +000011401 if (IsError) return true;
11402
Dmitri Gribenko7297a2e2013-05-09 23:32:58 +000011403 DiagnoseSentinelCalls(Method, LParenLoc, Args);
Eli Friedmane61eb042012-02-18 04:48:30 +000011404
Richard Smith831421f2012-06-25 20:30:08 +000011405 if (CheckFunctionCall(Method, TheCall, Proto))
Anders Carlssond406bf02009-08-16 01:56:34 +000011406 return true;
11407
John McCall182f7092010-08-24 06:09:16 +000011408 return MaybeBindToTemporary(TheCall);
Douglas Gregorf9eb9052008-11-19 21:05:33 +000011409}
11410
Douglas Gregor8ba10742008-11-20 16:27:02 +000011411/// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
Mike Stump1eb44332009-09-09 15:08:12 +000011412/// (if one exists), where @c Base is an expression of class type and
Douglas Gregor8ba10742008-11-20 16:27:02 +000011413/// @c Member is the name of the member we're trying to find.
John McCall60d7b3a2010-08-24 06:29:42 +000011414ExprResult
John McCall9ae2f072010-08-23 23:25:46 +000011415Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc) {
Chandler Carruth6df868e2010-12-12 08:17:55 +000011416 assert(Base->getType()->isRecordType() &&
11417 "left-hand side must have class type");
Mike Stump1eb44332009-09-09 15:08:12 +000011418
John McCall5acb0c92011-10-17 18:40:02 +000011419 if (checkPlaceholderForOverload(*this, Base))
11420 return ExprError();
John McCall0e800c92010-12-04 08:14:53 +000011421
John McCall5769d612010-02-08 23:07:23 +000011422 SourceLocation Loc = Base->getExprLoc();
11423
Douglas Gregor8ba10742008-11-20 16:27:02 +000011424 // C++ [over.ref]p1:
11425 //
11426 // [...] An expression x->m is interpreted as (x.operator->())->m
11427 // for a class object x of type T if T::operator->() exists and if
11428 // the operator is selected as the best match function by the
11429 // overload resolution mechanism (13.3).
Chandler Carruth6df868e2010-12-12 08:17:55 +000011430 DeclarationName OpName =
11431 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
John McCall5769d612010-02-08 23:07:23 +000011432 OverloadCandidateSet CandidateSet(Loc);
Ted Kremenek6217b802009-07-29 21:53:49 +000011433 const RecordType *BaseRecord = Base->getType()->getAs<RecordType>();
Douglas Gregorfe85ced2009-08-06 03:17:00 +000011434
John McCall5769d612010-02-08 23:07:23 +000011435 if (RequireCompleteType(Loc, Base->getType(),
Douglas Gregord10099e2012-05-04 16:32:21 +000011436 diag::err_typecheck_incomplete_tag, Base))
Eli Friedmanf43fb722009-11-18 01:28:03 +000011437 return ExprError();
11438
John McCalla24dc2e2009-11-17 02:14:36 +000011439 LookupResult R(*this, OpName, OpLoc, LookupOrdinaryName);
11440 LookupQualifiedName(R, BaseRecord->getDecl());
11441 R.suppressDiagnostics();
Anders Carlssone30572a2009-09-10 23:18:36 +000011442
11443 for (LookupResult::iterator Oper = R.begin(), OperEnd = R.end();
John McCall701c89e2009-12-03 04:06:58 +000011444 Oper != OperEnd; ++Oper) {
Douglas Gregor2c9a03f2011-01-26 19:30:28 +000011445 AddMethodCandidate(Oper.getPair(), Base->getType(), Base->Classify(Context),
Dmitri Gribenko55431692013-05-05 00:41:58 +000011446 None, CandidateSet, /*SuppressUserConversions=*/false);
John McCall701c89e2009-12-03 04:06:58 +000011447 }
Douglas Gregor8ba10742008-11-20 16:27:02 +000011448
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011449 bool HadMultipleCandidates = (CandidateSet.size() > 1);
11450
Douglas Gregor8ba10742008-11-20 16:27:02 +000011451 // Perform overload resolution.
11452 OverloadCandidateSet::iterator Best;
John McCall120d63c2010-08-24 20:38:10 +000011453 switch (CandidateSet.BestViableFunction(*this, OpLoc, Best)) {
Douglas Gregor8ba10742008-11-20 16:27:02 +000011454 case OR_Success:
11455 // Overload resolution succeeded; we'll build the call below.
11456 break;
11457
11458 case OR_No_Viable_Function:
11459 if (CandidateSet.empty())
11460 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
Douglas Gregorfe85ced2009-08-06 03:17:00 +000011461 << Base->getType() << Base->getSourceRange();
Douglas Gregor8ba10742008-11-20 16:27:02 +000011462 else
11463 Diag(OpLoc, diag::err_ovl_no_viable_oper)
Douglas Gregorfe85ced2009-08-06 03:17:00 +000011464 << "operator->" << Base->getSourceRange();
Ahmed Charles13a140c2012-02-25 11:00:22 +000011465 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Base);
Douglas Gregorfe85ced2009-08-06 03:17:00 +000011466 return ExprError();
Douglas Gregor8ba10742008-11-20 16:27:02 +000011467
11468 case OR_Ambiguous:
Douglas Gregorae2cf762010-11-13 20:06:38 +000011469 Diag(OpLoc, diag::err_ovl_ambiguous_oper_unary)
11470 << "->" << Base->getType() << Base->getSourceRange();
Ahmed Charles13a140c2012-02-25 11:00:22 +000011471 CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, Base);
Douglas Gregorfe85ced2009-08-06 03:17:00 +000011472 return ExprError();
Douglas Gregor48f3bb92009-02-18 21:56:37 +000011473
11474 case OR_Deleted:
11475 Diag(OpLoc, diag::err_ovl_deleted_oper)
11476 << Best->Function->isDeleted()
Fariborz Jahanian5e24f2a2011-02-25 20:51:14 +000011477 << "->"
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000011478 << getDeletedOrUnavailableSuffix(Best->Function)
Fariborz Jahanian5e24f2a2011-02-25 20:51:14 +000011479 << Base->getSourceRange();
Ahmed Charles13a140c2012-02-25 11:00:22 +000011480 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Base);
Douglas Gregorfe85ced2009-08-06 03:17:00 +000011481 return ExprError();
Douglas Gregor8ba10742008-11-20 16:27:02 +000011482 }
11483
John McCall9aa472c2010-03-19 07:35:19 +000011484 CheckMemberOperatorAccess(OpLoc, Base, 0, Best->FoundDecl);
11485
Douglas Gregor8ba10742008-11-20 16:27:02 +000011486 // Convert the object parameter.
11487 CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
John Wiegley429bb272011-04-08 18:41:53 +000011488 ExprResult BaseResult =
11489 PerformObjectArgumentInitialization(Base, /*Qualifier=*/0,
11490 Best->FoundDecl, Method);
11491 if (BaseResult.isInvalid())
Douglas Gregorfe85ced2009-08-06 03:17:00 +000011492 return ExprError();
John Wiegley429bb272011-04-08 18:41:53 +000011493 Base = BaseResult.take();
Douglas Gregorfc195ef2008-11-21 03:04:22 +000011494
Douglas Gregor8ba10742008-11-20 16:27:02 +000011495 // Build the operator call.
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000011496 ExprResult FnExpr = CreateFunctionRefExpr(*this, Method, Best->FoundDecl,
Argyrios Kyrtzidis46e75472012-02-08 01:21:13 +000011497 HadMultipleCandidates, OpLoc);
John Wiegley429bb272011-04-08 18:41:53 +000011498 if (FnExpr.isInvalid())
11499 return ExprError();
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011500
John McCallf89e55a2010-11-18 06:31:45 +000011501 QualType ResultTy = Method->getResultType();
11502 ExprValueKind VK = Expr::getValueKindForType(ResultTy);
11503 ResultTy = ResultTy.getNonLValueExprType(Context);
John McCall9ae2f072010-08-23 23:25:46 +000011504 CXXOperatorCallExpr *TheCall =
John Wiegley429bb272011-04-08 18:41:53 +000011505 new (Context) CXXOperatorCallExpr(Context, OO_Arrow, FnExpr.take(),
Lang Hamesbe9af122012-10-02 04:45:10 +000011506 Base, ResultTy, VK, OpLoc, false);
Anders Carlsson15ea3782009-10-13 22:43:21 +000011507
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011508 if (CheckCallReturnType(Method->getResultType(), OpLoc, TheCall,
Anders Carlsson15ea3782009-10-13 22:43:21 +000011509 Method))
11510 return ExprError();
Eli Friedmand5931902011-04-04 01:18:25 +000011511
11512 return MaybeBindToTemporary(TheCall);
Douglas Gregor8ba10742008-11-20 16:27:02 +000011513}
11514
Richard Smith36f5cfe2012-03-09 08:00:36 +000011515/// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to
11516/// a literal operator described by the provided lookup results.
11517ExprResult Sema::BuildLiteralOperatorCall(LookupResult &R,
11518 DeclarationNameInfo &SuffixInfo,
11519 ArrayRef<Expr*> Args,
11520 SourceLocation LitEndLoc,
11521 TemplateArgumentListInfo *TemplateArgs) {
11522 SourceLocation UDSuffixLoc = SuffixInfo.getCXXLiteralOperatorNameLoc();
Richard Smith9fcce652012-03-07 08:35:16 +000011523
Richard Smith36f5cfe2012-03-09 08:00:36 +000011524 OverloadCandidateSet CandidateSet(UDSuffixLoc);
11525 AddFunctionCandidates(R.asUnresolvedSet(), Args, CandidateSet, true,
11526 TemplateArgs);
Richard Smith9fcce652012-03-07 08:35:16 +000011527
Richard Smith36f5cfe2012-03-09 08:00:36 +000011528 bool HadMultipleCandidates = (CandidateSet.size() > 1);
11529
Richard Smith36f5cfe2012-03-09 08:00:36 +000011530 // Perform overload resolution. This will usually be trivial, but might need
11531 // to perform substitutions for a literal operator template.
11532 OverloadCandidateSet::iterator Best;
11533 switch (CandidateSet.BestViableFunction(*this, UDSuffixLoc, Best)) {
11534 case OR_Success:
11535 case OR_Deleted:
11536 break;
11537
11538 case OR_No_Viable_Function:
11539 Diag(UDSuffixLoc, diag::err_ovl_no_viable_function_in_call)
11540 << R.getLookupName();
11541 CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Args);
11542 return ExprError();
11543
11544 case OR_Ambiguous:
11545 Diag(R.getNameLoc(), diag::err_ovl_ambiguous_call) << R.getLookupName();
11546 CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, Args);
11547 return ExprError();
Richard Smith9fcce652012-03-07 08:35:16 +000011548 }
11549
Richard Smith36f5cfe2012-03-09 08:00:36 +000011550 FunctionDecl *FD = Best->Function;
Nick Lewyckyf5a6aef2013-02-07 05:08:22 +000011551 ExprResult Fn = CreateFunctionRefExpr(*this, FD, Best->FoundDecl,
11552 HadMultipleCandidates,
Richard Smith36f5cfe2012-03-09 08:00:36 +000011553 SuffixInfo.getLoc(),
11554 SuffixInfo.getInfo());
11555 if (Fn.isInvalid())
11556 return true;
Richard Smith9fcce652012-03-07 08:35:16 +000011557
11558 // Check the argument types. This should almost always be a no-op, except
11559 // that array-to-pointer decay is applied to string literals.
Richard Smith9fcce652012-03-07 08:35:16 +000011560 Expr *ConvArgs[2];
Richard Smith958ba642013-05-05 15:51:06 +000011561 for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
Richard Smith9fcce652012-03-07 08:35:16 +000011562 ExprResult InputInit = PerformCopyInitialization(
11563 InitializedEntity::InitializeParameter(Context, FD->getParamDecl(ArgIdx)),
11564 SourceLocation(), Args[ArgIdx]);
11565 if (InputInit.isInvalid())
11566 return true;
11567 ConvArgs[ArgIdx] = InputInit.take();
11568 }
11569
Richard Smith9fcce652012-03-07 08:35:16 +000011570 QualType ResultTy = FD->getResultType();
11571 ExprValueKind VK = Expr::getValueKindForType(ResultTy);
11572 ResultTy = ResultTy.getNonLValueExprType(Context);
11573
Richard Smith9fcce652012-03-07 08:35:16 +000011574 UserDefinedLiteral *UDL =
Benjamin Kramer3b6bef92012-08-24 11:54:20 +000011575 new (Context) UserDefinedLiteral(Context, Fn.take(),
11576 llvm::makeArrayRef(ConvArgs, Args.size()),
Richard Smith9fcce652012-03-07 08:35:16 +000011577 ResultTy, VK, LitEndLoc, UDSuffixLoc);
11578
11579 if (CheckCallReturnType(FD->getResultType(), UDSuffixLoc, UDL, FD))
11580 return ExprError();
11581
Richard Smith831421f2012-06-25 20:30:08 +000011582 if (CheckFunctionCall(FD, UDL, NULL))
Richard Smith9fcce652012-03-07 08:35:16 +000011583 return ExprError();
11584
11585 return MaybeBindToTemporary(UDL);
11586}
11587
Sam Panzere1715b62012-08-21 00:52:01 +000011588/// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
11589/// given LookupResult is non-empty, it is assumed to describe a member which
11590/// will be invoked. Otherwise, the function will be found via argument
11591/// dependent lookup.
11592/// CallExpr is set to a valid expression and FRS_Success returned on success,
11593/// otherwise CallExpr is set to ExprError() and some non-success value
11594/// is returned.
11595Sema::ForRangeStatus
11596Sema::BuildForRangeBeginEndCall(Scope *S, SourceLocation Loc,
11597 SourceLocation RangeLoc, VarDecl *Decl,
11598 BeginEndFunction BEF,
11599 const DeclarationNameInfo &NameInfo,
11600 LookupResult &MemberLookup,
11601 OverloadCandidateSet *CandidateSet,
11602 Expr *Range, ExprResult *CallExpr) {
11603 CandidateSet->clear();
11604 if (!MemberLookup.empty()) {
11605 ExprResult MemberRef =
11606 BuildMemberReferenceExpr(Range, Range->getType(), Loc,
11607 /*IsPtr=*/false, CXXScopeSpec(),
11608 /*TemplateKWLoc=*/SourceLocation(),
11609 /*FirstQualifierInScope=*/0,
11610 MemberLookup,
11611 /*TemplateArgs=*/0);
11612 if (MemberRef.isInvalid()) {
11613 *CallExpr = ExprError();
11614 Diag(Range->getLocStart(), diag::note_in_for_range)
11615 << RangeLoc << BEF << Range->getType();
11616 return FRS_DiagnosticIssued;
11617 }
Dmitri Gribenko62ed8892013-05-05 20:40:26 +000011618 *CallExpr = ActOnCallExpr(S, MemberRef.get(), Loc, None, Loc, 0);
Sam Panzere1715b62012-08-21 00:52:01 +000011619 if (CallExpr->isInvalid()) {
11620 *CallExpr = ExprError();
11621 Diag(Range->getLocStart(), diag::note_in_for_range)
11622 << RangeLoc << BEF << Range->getType();
11623 return FRS_DiagnosticIssued;
11624 }
11625 } else {
11626 UnresolvedSet<0> FoundNames;
Sam Panzere1715b62012-08-21 00:52:01 +000011627 UnresolvedLookupExpr *Fn =
11628 UnresolvedLookupExpr::Create(Context, /*NamingClass=*/0,
11629 NestedNameSpecifierLoc(), NameInfo,
11630 /*NeedsADL=*/true, /*Overloaded=*/false,
Richard Smithb1502bc2012-10-18 17:56:02 +000011631 FoundNames.begin(), FoundNames.end());
Sam Panzere1715b62012-08-21 00:52:01 +000011632
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011633 bool CandidateSetError = buildOverloadedCallSet(S, Fn, Fn, Range, Loc,
Sam Panzere1715b62012-08-21 00:52:01 +000011634 CandidateSet, CallExpr);
11635 if (CandidateSet->empty() || CandidateSetError) {
11636 *CallExpr = ExprError();
11637 return FRS_NoViableFunction;
11638 }
11639 OverloadCandidateSet::iterator Best;
11640 OverloadingResult OverloadResult =
11641 CandidateSet->BestViableFunction(*this, Fn->getLocStart(), Best);
11642
11643 if (OverloadResult == OR_No_Viable_Function) {
11644 *CallExpr = ExprError();
11645 return FRS_NoViableFunction;
11646 }
Dmitri Gribenko9e00f122013-05-09 21:02:07 +000011647 *CallExpr = FinishOverloadedCallExpr(*this, S, Fn, Fn, Loc, Range,
Sam Panzere1715b62012-08-21 00:52:01 +000011648 Loc, 0, CandidateSet, &Best,
11649 OverloadResult,
11650 /*AllowTypoCorrection=*/false);
11651 if (CallExpr->isInvalid() || OverloadResult != OR_Success) {
11652 *CallExpr = ExprError();
11653 Diag(Range->getLocStart(), diag::note_in_for_range)
11654 << RangeLoc << BEF << Range->getType();
11655 return FRS_DiagnosticIssued;
11656 }
11657 }
11658 return FRS_Success;
11659}
11660
11661
Douglas Gregor904eed32008-11-10 20:40:00 +000011662/// FixOverloadedFunctionReference - E is an expression that refers to
11663/// a C++ overloaded function (possibly with some parentheses and
11664/// perhaps a '&' around it). We have resolved the overloaded function
11665/// to the function declaration Fn, so patch up the expression E to
Anders Carlsson96ad5332009-10-21 17:16:23 +000011666/// refer (possibly indirectly) to Fn. Returns the new expr.
John McCall161755a2010-04-06 21:38:20 +000011667Expr *Sema::FixOverloadedFunctionReference(Expr *E, DeclAccessPair Found,
John McCall6bb80172010-03-30 21:47:33 +000011668 FunctionDecl *Fn) {
Douglas Gregor904eed32008-11-10 20:40:00 +000011669 if (ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
John McCall6bb80172010-03-30 21:47:33 +000011670 Expr *SubExpr = FixOverloadedFunctionReference(PE->getSubExpr(),
11671 Found, Fn);
Douglas Gregor699ee522009-11-20 19:42:02 +000011672 if (SubExpr == PE->getSubExpr())
John McCall3fa5cae2010-10-26 07:05:15 +000011673 return PE;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011674
Douglas Gregor699ee522009-11-20 19:42:02 +000011675 return new (Context) ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011676 }
11677
Douglas Gregor699ee522009-11-20 19:42:02 +000011678 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
John McCall6bb80172010-03-30 21:47:33 +000011679 Expr *SubExpr = FixOverloadedFunctionReference(ICE->getSubExpr(),
11680 Found, Fn);
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011681 assert(Context.hasSameType(ICE->getSubExpr()->getType(),
Douglas Gregor699ee522009-11-20 19:42:02 +000011682 SubExpr->getType()) &&
Douglas Gregor097bfb12009-10-23 22:18:25 +000011683 "Implicit cast type cannot be determined from overload");
John McCallf871d0c2010-08-07 06:22:56 +000011684 assert(ICE->path_empty() && "fixing up hierarchy conversion?");
Douglas Gregor699ee522009-11-20 19:42:02 +000011685 if (SubExpr == ICE->getSubExpr())
John McCall3fa5cae2010-10-26 07:05:15 +000011686 return ICE;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011687
11688 return ImplicitCastExpr::Create(Context, ICE->getType(),
John McCallf871d0c2010-08-07 06:22:56 +000011689 ICE->getCastKind(),
11690 SubExpr, 0,
John McCall5baba9d2010-08-25 10:28:54 +000011691 ICE->getValueKind());
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011692 }
11693
Douglas Gregor699ee522009-11-20 19:42:02 +000011694 if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(E)) {
John McCall2de56d12010-08-25 11:45:40 +000011695 assert(UnOp->getOpcode() == UO_AddrOf &&
Douglas Gregor904eed32008-11-10 20:40:00 +000011696 "Can only take the address of an overloaded function");
Douglas Gregorb86b0572009-02-11 01:18:59 +000011697 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Fn)) {
11698 if (Method->isStatic()) {
11699 // Do nothing: static member functions aren't any different
11700 // from non-member functions.
John McCallba135432009-11-21 08:51:07 +000011701 } else {
John McCallf7a1a742009-11-24 19:00:30 +000011702 // Fix the sub expression, which really has to be an
11703 // UnresolvedLookupExpr holding an overloaded member function
11704 // or template.
John McCall6bb80172010-03-30 21:47:33 +000011705 Expr *SubExpr = FixOverloadedFunctionReference(UnOp->getSubExpr(),
11706 Found, Fn);
John McCallba135432009-11-21 08:51:07 +000011707 if (SubExpr == UnOp->getSubExpr())
John McCall3fa5cae2010-10-26 07:05:15 +000011708 return UnOp;
Douglas Gregor699ee522009-11-20 19:42:02 +000011709
John McCallba135432009-11-21 08:51:07 +000011710 assert(isa<DeclRefExpr>(SubExpr)
11711 && "fixed to something other than a decl ref");
11712 assert(cast<DeclRefExpr>(SubExpr)->getQualifier()
11713 && "fixed to a member ref with no nested name qualifier");
11714
11715 // We have taken the address of a pointer to member
11716 // function. Perform the computation here so that we get the
11717 // appropriate pointer to member type.
11718 QualType ClassType
11719 = Context.getTypeDeclType(cast<RecordDecl>(Method->getDeclContext()));
11720 QualType MemPtrType
11721 = Context.getMemberPointerType(Fn->getType(), ClassType.getTypePtr());
11722
John McCallf89e55a2010-11-18 06:31:45 +000011723 return new (Context) UnaryOperator(SubExpr, UO_AddrOf, MemPtrType,
11724 VK_RValue, OK_Ordinary,
11725 UnOp->getOperatorLoc());
Douglas Gregorb86b0572009-02-11 01:18:59 +000011726 }
11727 }
John McCall6bb80172010-03-30 21:47:33 +000011728 Expr *SubExpr = FixOverloadedFunctionReference(UnOp->getSubExpr(),
11729 Found, Fn);
Douglas Gregor699ee522009-11-20 19:42:02 +000011730 if (SubExpr == UnOp->getSubExpr())
John McCall3fa5cae2010-10-26 07:05:15 +000011731 return UnOp;
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011732
John McCall2de56d12010-08-25 11:45:40 +000011733 return new (Context) UnaryOperator(SubExpr, UO_AddrOf,
Douglas Gregor699ee522009-11-20 19:42:02 +000011734 Context.getPointerType(SubExpr->getType()),
John McCallf89e55a2010-11-18 06:31:45 +000011735 VK_RValue, OK_Ordinary,
Douglas Gregor699ee522009-11-20 19:42:02 +000011736 UnOp->getOperatorLoc());
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011737 }
John McCallba135432009-11-21 08:51:07 +000011738
11739 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
John McCallaa81e162009-12-01 22:10:20 +000011740 // FIXME: avoid copy.
11741 TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = 0;
John McCallf7a1a742009-11-24 19:00:30 +000011742 if (ULE->hasExplicitTemplateArgs()) {
John McCallaa81e162009-12-01 22:10:20 +000011743 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
11744 TemplateArgs = &TemplateArgsBuffer;
John McCallf7a1a742009-11-24 19:00:30 +000011745 }
11746
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011747 DeclRefExpr *DRE = DeclRefExpr::Create(Context,
11748 ULE->getQualifierLoc(),
Abramo Bagnarae4b92762012-01-27 09:46:47 +000011749 ULE->getTemplateKeywordLoc(),
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011750 Fn,
John McCallf4b88a42012-03-10 09:33:50 +000011751 /*enclosing*/ false, // FIXME?
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011752 ULE->getNameLoc(),
11753 Fn->getType(),
11754 VK_LValue,
11755 Found.getDecl(),
11756 TemplateArgs);
Richard Smithe6975e92012-04-17 00:58:00 +000011757 MarkDeclRefReferenced(DRE);
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011758 DRE->setHadMultipleCandidates(ULE->getNumDecls() > 1);
11759 return DRE;
John McCallba135432009-11-21 08:51:07 +000011760 }
11761
John McCall129e2df2009-11-30 22:42:35 +000011762 if (UnresolvedMemberExpr *MemExpr = dyn_cast<UnresolvedMemberExpr>(E)) {
John McCalld5532b62009-11-23 01:53:49 +000011763 // FIXME: avoid copy.
John McCallaa81e162009-12-01 22:10:20 +000011764 TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = 0;
11765 if (MemExpr->hasExplicitTemplateArgs()) {
11766 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
11767 TemplateArgs = &TemplateArgsBuffer;
11768 }
John McCalld5532b62009-11-23 01:53:49 +000011769
John McCallaa81e162009-12-01 22:10:20 +000011770 Expr *Base;
11771
John McCallf89e55a2010-11-18 06:31:45 +000011772 // If we're filling in a static method where we used to have an
11773 // implicit member access, rewrite to a simple decl ref.
John McCallaa81e162009-12-01 22:10:20 +000011774 if (MemExpr->isImplicitAccess()) {
11775 if (cast<CXXMethodDecl>(Fn)->isStatic()) {
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011776 DeclRefExpr *DRE = DeclRefExpr::Create(Context,
11777 MemExpr->getQualifierLoc(),
Abramo Bagnarae4b92762012-01-27 09:46:47 +000011778 MemExpr->getTemplateKeywordLoc(),
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011779 Fn,
John McCallf4b88a42012-03-10 09:33:50 +000011780 /*enclosing*/ false,
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011781 MemExpr->getMemberLoc(),
11782 Fn->getType(),
11783 VK_LValue,
11784 Found.getDecl(),
11785 TemplateArgs);
Richard Smithe6975e92012-04-17 00:58:00 +000011786 MarkDeclRefReferenced(DRE);
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011787 DRE->setHadMultipleCandidates(MemExpr->getNumDecls() > 1);
11788 return DRE;
Douglas Gregor828a1972010-01-07 23:12:05 +000011789 } else {
11790 SourceLocation Loc = MemExpr->getMemberLoc();
11791 if (MemExpr->getQualifier())
Douglas Gregor4c9be892011-02-28 20:01:57 +000011792 Loc = MemExpr->getQualifierLoc().getBeginLoc();
Eli Friedman72899c32012-01-07 04:59:52 +000011793 CheckCXXThisCapture(Loc);
Douglas Gregor828a1972010-01-07 23:12:05 +000011794 Base = new (Context) CXXThisExpr(Loc,
11795 MemExpr->getBaseType(),
11796 /*isImplicit=*/true);
11797 }
John McCallaa81e162009-12-01 22:10:20 +000011798 } else
John McCall3fa5cae2010-10-26 07:05:15 +000011799 Base = MemExpr->getBase();
John McCallaa81e162009-12-01 22:10:20 +000011800
John McCallf5307512011-04-27 00:36:17 +000011801 ExprValueKind valueKind;
11802 QualType type;
11803 if (cast<CXXMethodDecl>(Fn)->isStatic()) {
11804 valueKind = VK_LValue;
11805 type = Fn->getType();
11806 } else {
11807 valueKind = VK_RValue;
11808 type = Context.BoundMemberTy;
11809 }
11810
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011811 MemberExpr *ME = MemberExpr::Create(Context, Base,
11812 MemExpr->isArrow(),
11813 MemExpr->getQualifierLoc(),
Abramo Bagnarae4b92762012-01-27 09:46:47 +000011814 MemExpr->getTemplateKeywordLoc(),
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011815 Fn,
11816 Found,
11817 MemExpr->getMemberNameInfo(),
11818 TemplateArgs,
11819 type, valueKind, OK_Ordinary);
11820 ME->setHadMultipleCandidates(true);
Richard Smith4a030222012-11-14 07:06:31 +000011821 MarkMemberReferenced(ME);
Abramo Bagnara7cc58b42011-10-05 07:56:41 +000011822 return ME;
Douglas Gregor699ee522009-11-20 19:42:02 +000011823 }
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011824
John McCall3fa5cae2010-10-26 07:05:15 +000011825 llvm_unreachable("Invalid reference to overloaded function");
Douglas Gregor904eed32008-11-10 20:40:00 +000011826}
11827
NAKAMURA Takumidfbb02a2011-01-27 07:10:08 +000011828ExprResult Sema::FixOverloadedFunctionReference(ExprResult E,
John McCall60d7b3a2010-08-24 06:29:42 +000011829 DeclAccessPair Found,
11830 FunctionDecl *Fn) {
John McCall6bb80172010-03-30 21:47:33 +000011831 return Owned(FixOverloadedFunctionReference((Expr *)E.get(), Found, Fn));
Douglas Gregor20093b42009-12-09 23:02:17 +000011832}
11833
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000011834} // end namespace clang