10cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===--- SemaInit.cpp - Semantic Analysis for Initializers ----------------===// 20cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 30cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// The LLVM Compiler Infrastructure 40cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 50cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// This file is distributed under the University of Illinois Open Source 60cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// License. See LICENSE.TXT for details. 70cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 80cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===----------------------------------------------------------------------===// 90cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 105d3d41d0873d51b405972baf38e1f3a7ef5b49e0Sebastian Redl// This file implements semantic analysis for initializers. 11dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// 120cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===----------------------------------------------------------------------===// 130cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 14e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Initialization.h" 150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff#include "clang/AST/ASTContext.h" 167cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 172078bb9c9336da56ea521e98e718556b227541f6Anders Carlsson#include "clang/AST/ExprCXX.h" 1879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner#include "clang/AST/ExprObjC.h" 19d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor#include "clang/AST/TypeLoc.h" 20c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "clang/Basic/TargetInfo.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Designator.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Lookup.h" 2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/SemaInternal.h" 242b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl#include "llvm/ADT/APInt.h" 258fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h" 2620093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "llvm/Support/ErrorHandling.h" 27191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin#include "llvm/Support/raw_ostream.h" 28c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor#include <map> 2905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorusing namespace clang; 300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 31dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 32dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Sema Initialization Checking 33dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 34dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 350ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg/// \brief Check whether T is compatible with a wide character type (wchar_t, 360ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg/// char16_t or char32_t). 370ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborgstatic bool IsWideCharCompatible(QualType T, ASTContext &Context) { 380ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (Context.typesAreCompatible(Context.getWideCharType(), T)) 390ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return true; 400ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (Context.getLangOpts().CPlusPlus || Context.getLangOpts().C11) { 410ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return Context.typesAreCompatible(Context.Char16Ty, T) || 420ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg Context.typesAreCompatible(Context.Char32Ty, T); 430ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg } 440ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return false; 450ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg} 460ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg 470ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborgenum StringInitFailureKind { 480ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SIF_None, 490ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SIF_NarrowStringIntoWideChar, 500ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SIF_WideStringIntoChar, 510ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SIF_IncompatWideStringIntoWideChar, 520ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SIF_Other 530ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg}; 540ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg 550ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg/// \brief Check whether the array of type AT can be initialized by the Init 560ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg/// expression by means of string initialization. Returns SIF_None if so, 570ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg/// otherwise returns a StringInitFailureKind that describes why the 580ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg/// initialization would not work. 590ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborgstatic StringInitFailureKind IsStringInit(Expr *Init, const ArrayType *AT, 600ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg ASTContext &Context) { 618718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 620ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_Other; 638718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 648879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 658879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 678879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 688879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 690ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_None; 708879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 718879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 728879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!SL) 740ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_Other; 75bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 760ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg const QualType ElemTy = 770ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg Context.getCanonicalType(AT->getElementType()).getUnqualifiedType(); 785cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 795cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor switch (SL->getKind()) { 805cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Ascii: 815cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF8: 825cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // char array can be initialized with a narrow string. 835cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // Only allow char x[] = "foo"; not char x[] = L"foo"; 840ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (ElemTy->isCharType()) 850ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_None; 860ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (IsWideCharCompatible(ElemTy, Context)) 870ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_NarrowStringIntoWideChar; 880ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_Other; 890ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg // C99 6.7.8p15 (with correction from DR343), or C11 6.7.9p15: 900ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg // "An array with element type compatible with a qualified or unqualified 910ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg // version of wchar_t, char16_t, or char32_t may be initialized by a wide 920ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg // string literal with the corresponding encoding prefix (L, u, or U, 930ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg // respectively), optionally enclosed in braces. 945cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF16: 950ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (Context.typesAreCompatible(Context.Char16Ty, ElemTy)) 960ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_None; 970ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (ElemTy->isCharType()) 980ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_WideStringIntoChar; 990ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (IsWideCharCompatible(ElemTy, Context)) 1000ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_IncompatWideStringIntoWideChar; 1010ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_Other; 1025cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF32: 1030ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (Context.typesAreCompatible(Context.Char32Ty, ElemTy)) 1040ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_None; 1050ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (ElemTy->isCharType()) 1060ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_WideStringIntoChar; 1070ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (IsWideCharCompatible(ElemTy, Context)) 1080ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_IncompatWideStringIntoWideChar; 1090ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_Other; 1105cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Wide: 1110ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (Context.typesAreCompatible(Context.getWideCharType(), ElemTy)) 1120ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_None; 1130ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (ElemTy->isCharType()) 1140ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_WideStringIntoChar; 1150ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (IsWideCharCompatible(ElemTy, Context)) 1160ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_IncompatWideStringIntoWideChar; 1170ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return SIF_Other; 1185cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor } 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1205cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor llvm_unreachable("missed a StringLiteral kind?"); 121dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 122dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 123c1fb1e0b79cf2762896e57e43f51da5fedd88d77Hans Wennborgstatic StringInitFailureKind IsStringInit(Expr *init, QualType declType, 124c1fb1e0b79cf2762896e57e43f51da5fedd88d77Hans Wennborg ASTContext &Context) { 125ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = Context.getAsArrayType(declType); 1260ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (!arrayType) 127c1fb1e0b79cf2762896e57e43f51da5fedd88d77Hans Wennborg return SIF_Other; 128c1fb1e0b79cf2762896e57e43f51da5fedd88d77Hans Wennborg return IsStringInit(init, arrayType, Context); 129ce6c9b7da219c8640a0559f75770cfc6622de083John McCall} 130ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 13130ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith/// Update the type of a string literal, including any surrounding parentheses, 13230ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith/// to match the type of the object which it is initializing. 13330ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smithstatic void updateStringLiteralType(Expr *E, QualType Ty) { 13427f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith while (true) { 13530ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith E->setType(Ty); 13627f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith if (isa<StringLiteral>(E) || isa<ObjCEncodeExpr>(E)) 13727f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith break; 13827f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith else if (ParenExpr *PE = dyn_cast<ParenExpr>(E)) 13927f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith E = PE->getSubExpr(); 14027f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) 14127f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith E = UO->getSubExpr(); 14227f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith else if (GenericSelectionExpr *GSE = dyn_cast<GenericSelectionExpr>(E)) 14327f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith E = GSE->getResultExpr(); 14427f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith else 14527f9cf3a5a92f70f043b6cfbc5f3f2ac3a38f182Richard Smith llvm_unreachable("unexpected expr in string literal init"); 14630ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith } 14730ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith} 14830ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith 149fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCallstatic void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT, 150fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall Sema &S) { 15179e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 1520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto *ConstantArrayTy = 1530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines cast<ConstantArrayType>(Str->getType()->getAsArrayTypeUnsafe()); 1540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines uint64_t StrLength = ConstantArrayTy->getSize().getZExtValue(); 1551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 156dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 158dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 15965263b4ec184212155c92740ab0bd363bb85c49eBenjamin Kramer llvm::APInt ConstVal(32, StrLength); 160dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 16146a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 16246a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 16346a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 16430ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith updateStringLiteralType(Str, DeclT); 16519da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 166dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1688718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 1691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 170bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // We have an array of character type with known size. However, 1718718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 1728718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 1734e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus) { 17430ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith if (StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens())) { 175b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // For Pascal strings it's OK to strip off the terminating null character, 176b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // so the example below is valid: 177b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // 178b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // unsigned char a[2] = "\pa"; 179b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (SL->isPascal()) 180b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson StrLength--; 181b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson } 182b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson 183bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // [dcl.init.string]p2 184bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength > CAT->getSize().getZExtValue()) 18596a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar S.Diag(Str->getLocStart(), 186bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::err_initializer_string_for_char_array_too_long) 187bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 188bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } else { 189bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // C99 6.7.8p14. 190bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 19196a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar S.Diag(Str->getLocStart(), 192176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diag::ext_initializer_string_for_char_array_too_long) 193bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 194bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1968718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 1978718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1988718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1998718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 20030ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith updateStringLiteralType(Str, DeclT); 201dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 202dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 203dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 204dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 205dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 206dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 2079e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 2089e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 2099e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 2109e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 2119e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 2129e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 2139e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 2149e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 2159e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 2169e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 2179e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 2189e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 2199e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 2209e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 22163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// arguments, which contains the current "structured" (semantic) 2229e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 2239e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 2249e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 2259e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 2269e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 2279e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 2289e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 2299e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 2309e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 2319e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 2329e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 2339e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 2348b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 235c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 2360820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 237c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 23814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool VerifyOnly; // no diagnostics, no structure building 239a789416a497b2e14e7c2fd721d03e541120bac8dBenjamin Kramer llvm::DenseMap<InitListExpr *, InitListExpr *> SyntacticToSemantic; 240c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2428ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 243987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 2449e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 245629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman unsigned &StructuredIndex); 2468ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 24746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 248b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith InitListExpr *StructuredList, 249eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 2508ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 25146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 2521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 253c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 2549e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 255eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 256eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 2578ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 25846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 259c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 2609e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2619e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2620c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman void CheckComplexType(const InitializedEntity &Entity, 2630c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *IList, QualType DeclType, 2640c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &Index, 2650c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *StructuredList, 2660c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &StructuredIndex); 2678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 26846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 269c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 2709e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2719e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2728ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 2738ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 274930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 275930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 276930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 2778ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 27846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 2799e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2809e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2818ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 2822bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 284c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2859e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 286eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 287eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 2888ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 289784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 291c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2929e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2939e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2948ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 2959a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 296711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 2971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 298c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 299c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 300c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 301c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 302c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 303eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 304eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 305c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 306c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 307c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 308c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 309c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 3109e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 3119e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 312c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 313c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 314c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 315930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 316c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines static ExprResult PerformEmptyInit(Sema &SemaRef, 317c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation Loc, 318c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const InitializedEntity &Entity, 319c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool VerifyOnly); 320c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void FillInEmptyInitForField(unsigned Init, FieldDecl *Field, 321d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 322d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 323c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void FillInEmptyInitializations(const InitializedEntity &Entity, 324cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 325f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool CheckFlexibleArrayInit(const InitializedEntity &Entity, 326f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman Expr *InitExpr, FieldDecl *Field, 327f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool TopLevelObject); 328c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void CheckEmptyInitializable(const InitializedEntity &Entity, 329c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation Loc); 3303ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 331c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 332cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 33340cba90626044ff28b58c33e743366e94c898227Richard Smith InitListExpr *IL, QualType &T, bool VerifyOnly); 334c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 335c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 336c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 337c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 338c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 339c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 3408b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 34168355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 342c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesExprResult InitListChecker::PerformEmptyInit(Sema &SemaRef, 343c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation Loc, 344c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const InitializedEntity &Entity, 345c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool VerifyOnly) { 3463ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 3473ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl true); 348c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines MultiExprArg SubInit; 349c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Expr *InitExpr; 350c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitListExpr DummyInitList(SemaRef.Context, Loc, None, Loc); 351c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 352c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // C++ [dcl.init.aggr]p7: 353c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // If there are fewer initializer-clauses in the list than there are 354c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // members in the aggregate, then each member not explicitly initialized 355c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // ... 356c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool EmptyInitList = SemaRef.getLangOpts().CPlusPlus11 && 357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Entity.getType()->getBaseElementTypeUnsafe()->isRecordType(); 358c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (EmptyInitList) { 359c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // C++1y / DR1070: 360c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // shall be initialized [...] from an empty initializer list. 361c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // 362c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // We apply the resolution of this DR to C++11 but not C++98, since C++98 363c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // does not have useful semantics for initialization from an init list. 364c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // We treat this as copy-initialization, because aggregate initialization 365c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // always performs copy-initialization on its elements. 366c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // 367c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Only do this if we're initializing a class type, to avoid filling in 368c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // the initializer list where possible. 369c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitExpr = VerifyOnly ? &DummyInitList : new (SemaRef.Context) 370c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitListExpr(SemaRef.Context, Loc, None, Loc); 371c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitExpr->setType(SemaRef.Context.VoidTy); 372c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SubInit = InitExpr; 373c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Kind = InitializationKind::CreateCopy(Loc, Loc); 374c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } else { 375c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // C++03: 376c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // shall be value-initialized. 377c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 378c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 379c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitializationSequence InitSeq(SemaRef, Entity, Kind, SubInit); 380c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // libstdc++4.6 marks the vector default constructor as explicit in 381c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // _GLIBCXX_DEBUG mode, so recover using the C++03 logic in that case. 382c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // stlport does so too. Look for std::__debug for libstdc++, and for 383c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // std:: for stlport. This is effectively a compiler-side implementation of 384c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // LWG2193. 385c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!InitSeq && EmptyInitList && InitSeq.getFailureKind() == 386c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitializationSequence::FK_ExplicitConstructor) { 387c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines OverloadCandidateSet::iterator Best; 388c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines OverloadingResult O = 389c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitSeq.getFailedCandidateSet() 390c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines .BestViableFunction(SemaRef, Kind.getLocation(), Best); 391c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines (void)O; 392c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines assert(O == OR_Success && "Inconsistent overload resolution"); 393c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function); 394c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CXXRecordDecl *R = CtorDecl->getParent(); 395c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 396c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (CtorDecl->getMinRequiredArguments() == 0 && 397c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CtorDecl->isExplicit() && R->getDeclName() && 398c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.SourceMgr.isInSystemHeader(CtorDecl->getLocation())) { 399c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 400c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 401c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool IsInStd = false; 402c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines for (NamespaceDecl *ND = dyn_cast<NamespaceDecl>(R->getDeclContext()); 403c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ND && !IsInStd; ND = dyn_cast<NamespaceDecl>(ND->getParent())) { 404c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (SemaRef.getStdNamespace()->InEnclosingNamespaceSetOf(ND)) 405c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines IsInStd = true; 406c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 407c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 408c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (IsInStd && llvm::StringSwitch<bool>(R->getName()) 409c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines .Cases("basic_string", "deque", "forward_list", true) 410c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines .Cases("list", "map", "multimap", "multiset", true) 411c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines .Cases("priority_queue", "queue", "set", "stack", true) 412c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines .Cases("unordered_map", "unordered_set", "vector", true) 413c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines .Default(false)) { 414c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitSeq.InitializeFrom( 415c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef, Entity, 416c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitializationKind::CreateValue(Loc, Loc, Loc, true), 417c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines MultiExprArg(), /*TopLevelOfInitList=*/false); 418c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Emit a warning for this. System header warnings aren't shown 419c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // by default, but people working on system headers should see it. 420c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!VerifyOnly) { 421c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.Diag(CtorDecl->getLocation(), 422c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::warn_invalid_initializer_from_system_header); 423c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.Diag(Entity.getDecl()->getLocation(), 424c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::note_used_in_initialization_here); 425c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 426c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 427c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 428c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 429c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!InitSeq) { 430c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!VerifyOnly) { 431c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit); 432c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (Entity.getKind() == InitializedEntity::EK_Member) 433c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.Diag(Entity.getDecl()->getLocation(), 434c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::note_in_omitted_aggregate_initializer) 435c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << /*field*/1 << Entity.getDecl(); 436c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines else if (Entity.getKind() == InitializedEntity::EK_ArrayElement) 437c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.Diag(Loc, diag::note_in_omitted_aggregate_initializer) 438c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << /*array element*/0 << Entity.getElementIndex(); 439c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 440c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return ExprError(); 441c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 442c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 443c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return VerifyOnly ? ExprResult(static_cast<Expr *>(nullptr)) 444c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines : InitSeq.Perform(SemaRef, Entity, Kind, SubInit); 445c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 446c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 447c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid InitListChecker::CheckEmptyInitializable(const InitializedEntity &Entity, 448c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation Loc) { 449c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines assert(VerifyOnly && 450c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines "CheckEmptyInitializable is only inteded for verification mode."); 451c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (PerformEmptyInit(SemaRef, Loc, Entity, /*VerifyOnly*/true).isInvalid()) 4523ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl hadError = true; 4533ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl} 4543ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 455c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid InitListChecker::FillInEmptyInitForField(unsigned Init, FieldDecl *Field, 456d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 457dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitListExpr *ILE, 458d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 459c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation Loc = ILE->getLocEnd(); 460d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 461dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity MemberEntity 462d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 463d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 464c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // C++1y [dcl.init.aggr]p7: 465c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // If there are fewer initializer-clauses in the list than there are 466c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // members in the aggregate, then each member not explicitly initialized 467c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // shall be initialized from its brace-or-equal-initializer [...] 468c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (Field->hasInClassInitializer()) { 469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ExprResult DIE = SemaRef.BuildCXXDefaultInitExpr(Loc, Field); 470176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (DIE.isInvalid()) { 471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines hadError = true; 472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 473176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 474c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (Init < NumInits) 475176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ILE->setInit(Init, DIE.get()); 476c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith else { 477176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ILE->updateInit(SemaRef.Context, Init, DIE.get()); 478c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith RequiresSecondPass = true; 479c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 480c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith return; 481c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 482c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 483d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 484d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 485d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 486d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 487d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 488d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 489d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 490d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 491d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 492d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 493d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 494d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 495d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 496dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 497c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprResult MemberInit = PerformEmptyInit(SemaRef, Loc, MemberEntity, 498c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /*VerifyOnly*/false); 499d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 500d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 501d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 502d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 503dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 504d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 505d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 506d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 507c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ILE->setInit(Init, MemberInit.getAs<Expr>()); 508c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } else if (!isa<ImplicitValueInitExpr>(MemberInit.get())) { 509c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Empty initialization requires a constructor call, so 510d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 511d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 512d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 513c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ILE->updateInit(SemaRef.Context, Init, MemberInit.getAs<Expr>()); 514d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 515d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 516d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 517d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 518c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FillInEmptyInitializations(MemberEntity, InnerILE, 519dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi RequiresSecondPass); 520d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 521d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 5224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 5234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 5244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 525dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 526c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesInitListChecker::FillInEmptyInitializations(const InitializedEntity &Entity, 527cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 528cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 530930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5326217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 533c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith const RecordDecl *RDecl = RType->getDecl(); 534c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (RDecl->isUnion() && ILE->getInitializedFieldInUnion()) 535c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FillInEmptyInitForField(0, ILE->getInitializedFieldInUnion(), 536d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 537c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith else if (RDecl->isUnion() && isa<CXXRecordDecl>(RDecl) && 538c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith cast<CXXRecordDecl>(RDecl)->hasInClassInitializer()) { 539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *Field : RDecl->fields()) { 540c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (Field->hasInClassInitializer()) { 541c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FillInEmptyInitForField(0, Field, Entity, ILE, RequiresSecondPass); 542c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith break; 543c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 544c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 545c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } else { 546d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *Field : RDecl->fields()) { 548d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 549d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 550d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 551d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 55287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 55387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 554c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FillInEmptyInitForField(Init, Field, Entity, ILE, RequiresSecondPass); 555d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 556cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 557cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 558d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 559d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 560d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 561c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (RDecl->isUnion()) 562d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 563d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 5644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 5654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 5664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 5671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 5684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 5694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 571cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 57287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 57387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 5740820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 5754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 57687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 57787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 578dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 579cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 580183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 5814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 58287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 583dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 584cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 5851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 5864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 5871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 58916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 59016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 59116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 592d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 593d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 594cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 595cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 5966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : nullptr); 59721f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis if (!InitExpr && !ILE->hasArrayFiller()) { 598c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprResult ElementInit = PerformEmptyInit(SemaRef, ILE->getLocEnd(), 599c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ElementEntity, 600c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /*VerifyOnly*/false); 601cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 60216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 603cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 604cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 605cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 606cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 607cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 608cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 6093e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 6103e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // of the "holes" in the array. 6113e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) 612c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ILE->setArrayFiller(ElementInit.getAs<Expr>()); 6133e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis else 614c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ILE->setInit(Init, ElementInit.getAs<Expr>()); 6154423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } else { 6164423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 6174423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // of the rest of elements and exit. 6184423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) { 619c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ILE->setArrayFiller(ElementInit.getAs<Expr>()); 6204423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return; 6214423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 6224423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis 623c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!isa<ImplicitValueInitExpr>(ElementInit.get())) { 624c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Empty initialization requires a constructor call, so 6254423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // extend the initializer list to include the constructor 6264423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // call and make a note that we'll need to take another pass 6274423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // through the initializer list. 628c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ILE->updateInit(SemaRef.Context, Init, ElementInit.getAs<Expr>()); 6294423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis RequiresSecondPass = true; 6304423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 631cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 632ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 63321f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis = dyn_cast_or_null<InitListExpr>(InitExpr)) 634c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FillInEmptyInitializations(ElementEntity, InnerILE, RequiresSecondPass); 6354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 6364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 6374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 63868355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 639cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 64014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr *IL, QualType &T, 64140cba90626044ff28b58c33e743366e94c898227Richard Smith bool VerifyOnly) 64240cba90626044ff28b58c33e743366e94c898227Richard Smith : SemaRef(S), VerifyOnly(VerifyOnly) { 6430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Check that IL isn't already the semantic form of some other 6440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // InitListExpr. If it is, we'd create a broken AST. 6450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 6460cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 647c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 648b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith FullyStructuredList = 6496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getStructuredSubobjectInit(IL, 0, T, nullptr, 0, IL->getSourceRange()); 650b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith CheckExplicitInitList(Entity, IL, T, FullyStructuredList, 651eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 652c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 65314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!hadError && !VerifyOnly) { 654cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 655c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FillInEmptyInitializations(Entity, FullyStructuredList, RequiresSecondPass); 65616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 657c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FillInEmptyInitializations(Entity, FullyStructuredList, 658cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 659cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 6600cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6610cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6620cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 663638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 664638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 665c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 6660820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 6670cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 6680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 6690cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 6700cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6710cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6720cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 6736217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 6744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *Field : structDecl->fields()) 676d61db33331c264d6361283602b248a7423040597Douglas Gregor if (!Field->isUnnamedBitfield()) 6774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 67939ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 680f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 681f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 6820cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6830cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 684b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// Check whether the range of the initializer \p ParentIList from element 685b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// \p Index onwards can be used to initialize an object of type \p T. Update 686b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// \p Index to indicate how many elements of the list were consumed. 687b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// 688b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// This also fills in \p StructuredList, from element \p StructuredIndex 689b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// onwards, with the fully-braced, desugared form of the initialization. 6908ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 691987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 6924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 6934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 694629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman unsigned &StructuredIndex) { 6950cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6970cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 6980cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 699fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (T->isRecordType()) 7000cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 701b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 702183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 7030cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 704b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("CheckImplicitInitList(): Illegal type"); 705b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 706402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 70714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 70814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 70914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_implicit_empty_initializer); 7104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 711402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 712402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 713402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 714402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 7154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 7164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 7171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 71996a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SourceRange(ParentIList->getInit(Index)->getLocStart(), 720ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 7214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 7224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 7234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 72487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 725dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, ParentIList, T, 726987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 728629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman StructuredSubobjectInitIndex); 729c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl 73040cba90626044ff28b58c33e743366e94c898227Richard Smith if (!VerifyOnly) { 73114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->setType(T); 73214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 733c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 73414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Update the structured sub-object initializer so that it's ending 73514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // range corresponds with the end of the last initializer it used. 73614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (EndIndex < ParentIList->getNumInits()) { 73714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SourceLocation EndLoc 73814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 73914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->setRBraceLoc(EndLoc); 74014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 74114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 742c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl // Complain about missing braces. 74314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (T->isArrayType() || T->isRecordType()) { 74414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), 74540cba90626044ff28b58c33e743366e94c898227Richard Smith diag::warn_missing_braces) 7466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << StructuredSubobjectInitList->getSourceRange() 7476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << FixItHint::CreateInsertion( 7486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StructuredSubobjectInitList->getLocStart(), "{") 7496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << FixItHint::CreateInsertion( 7506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SemaRef.getLocForEndOfToken( 7516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StructuredSubobjectInitList->getLocEnd()), 7526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "}"); 75314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 7541e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner } 7550cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 7560cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 7570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// Warn that \p Entity was of scalar type and was initialized by a 7580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// single-element braced initializer list. 7590e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity, 7600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SourceRange Braces) { 7610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Don't warn during template instantiation. If the initialization was 7620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // non-dependent, we warned during the initial parse; otherwise, the 7630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // type might not be scalar in some uses of the template. 7640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!S.ActiveTemplateInstantiations.empty()) 7650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 7660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned DiagID = 0; 7680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines switch (Entity.getKind()) { 7700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_VectorElement: 7710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_ComplexElement: 7720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_ArrayElement: 7730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Parameter: 7740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Parameter_CF_Audited: 7750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Result: 7760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Extra braces here are suspicious. 7770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DiagID = diag::warn_braces_around_scalar_init; 7780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 7790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Member: 7810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Warn on aggregate initialization but not on ctor init list or 7820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // default member initializer. 7830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Entity.getParent()) 7840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DiagID = diag::warn_braces_around_scalar_init; 7850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 7860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Variable: 7880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_LambdaCapture: 7890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // No warning, might be direct-list-initialization. 7900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Should we warn for copy-list-initialization in these cases? 7910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 7920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_New: 7940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Temporary: 7950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_CompoundLiteralInit: 7960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // No warning, braces are part of the syntax of the underlying construct. 7970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 7980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_RelatedResult: 8000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // No warning, we already warned when initializing the result. 8010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 8020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 8030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Exception: 8040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Base: 8050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_Delegating: 8060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case InitializedEntity::EK_BlockElement: 8070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm_unreachable("unexpected braced scalar init"); 8080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 8090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 8100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (DiagID) { 8110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines S.Diag(Braces.getBegin(), DiagID) 8120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines << Braces 8130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines << FixItHint::CreateRemoval(Braces.getBegin()) 8140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines << FixItHint::CreateRemoval(Braces.getEnd()); 8150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 8160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 8170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 8180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 819b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// Check whether the initializer \p IList (that was written with explicit 820b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// braces) can be used to initialize an object of type \p T. 821b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// 822b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// This also fills in \p StructuredList with the fully-braced, desugared 823b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith/// form of the initialization. 8248ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 82546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 8264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 827eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 82814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 82914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SyntacticToSemantic[IList] = StructuredList; 83014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setSyntacticForm(IList); 83114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 832b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith 833b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith unsigned Index = 0, StructuredIndex = 0; 834dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 83546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 83614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 8375c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman QualType ExprTy = T; 8385c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman if (!ExprTy->isArrayType()) 8395c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context); 84014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->setType(ExprTy); 84114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setType(ExprTy); 84214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 843638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 844638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 845c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 846638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 847c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 84814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 8494e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus || 8504e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (SemaRef.getLangOpts().OpenCL && 85114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->getType()->isVectorType())) { 85214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 85314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 85414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 85514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 85614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 857e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 858c1fb1e0b79cf2762896e57e43f51da5fedd88d77Hans Wennborg IsStringInit(StructuredList->getInit(0), T, SemaRef.Context) == 859c1fb1e0b79cf2762896e57e43f51da5fedd88d77Hans Wennborg SIF_None) { 860176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned DK = diag::ext_excess_initializers_in_char_array_initializer; 8614e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 8627c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 863e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 864e540858b289b23653bcb23646f135729203635cbEli Friedman } 865bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 8660820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 867dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 868d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 869b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 870b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 871eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 873eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 874eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 875eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 876eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 877eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 8787c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 879176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned DK = diag::ext_excess_initializers; 8804e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 881e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 8820863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 8830863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 8844e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().OpenCL && initKind == 1) { 8850863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 886e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 887e540858b289b23653bcb23646f135729203635cbEli Friedman } 8887c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 8890820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 890eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 891c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 892c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 893cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 8940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!VerifyOnly && T->isScalarType() && 8950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines IList->getNumInits() == 1 && !isa<InitListExpr>(IList->getInit(0))) 8960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines warnBracedScalarInit(SemaRef, Entity, IList->getSourceRange()); 8970cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 8980cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 8998ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 90046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 90287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 9034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 9044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 905eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 906eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 9070c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) { 9080c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // Explicitly braced initializer for complex type can be real+imaginary 9090c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // parts. 9100c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman CheckComplexType(Entity, IList, DeclType, Index, 9110c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredList, StructuredIndex); 9120c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else if (DeclType->isScalarType()) { 91346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 91446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 915c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 916dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckVectorType(Entity, IList, DeclType, Index, 91746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 91820599392a99956eaac4cf351a0935574090cb6c3Richard Smith } else if (DeclType->isRecordType()) { 91920599392a99956eaac4cf351a0935574090cb6c3Richard Smith assert(DeclType->isAggregateType() && 92020599392a99956eaac4cf351a0935574090cb6c3Richard Smith "non-aggregate records should be handed in CheckSubElementType"); 92120599392a99956eaac4cf351a0935574090cb6c3Richard Smith RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 92220599392a99956eaac4cf351a0935574090cb6c3Richard Smith CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 92320599392a99956eaac4cf351a0935574090cb6c3Richard Smith SubobjectIsDesignatorContext, Index, 92420599392a99956eaac4cf351a0935574090cb6c3Richard Smith StructuredList, StructuredIndex, 92520599392a99956eaac4cf351a0935574090cb6c3Richard Smith TopLevelObject); 92620599392a99956eaac4cf351a0935574090cb6c3Richard Smith } else if (DeclType->isArrayType()) { 92720599392a99956eaac4cf351a0935574090cb6c3Richard Smith llvm::APSInt Zero( 92820599392a99956eaac4cf351a0935574090cb6c3Richard Smith SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 92920599392a99956eaac4cf351a0935574090cb6c3Richard Smith false); 93020599392a99956eaac4cf351a0935574090cb6c3Richard Smith CheckArrayType(Entity, IList, DeclType, Zero, 93120599392a99956eaac4cf351a0935574090cb6c3Richard Smith SubobjectIsDesignatorContext, Index, 93220599392a99956eaac4cf351a0935574090cb6c3Richard Smith StructuredList, StructuredIndex); 933613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 934613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 9354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 93614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 93714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 93814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 939d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 940930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 9418ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 9428ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 943c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } else if (DeclType->isObjCObjectType()) { 94414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 94514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class) 94614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 9474d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 9480cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 94914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 95014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 95114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 9524d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 9530cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 9540cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 9550cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 9568ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 95746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 9594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 9604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 9614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 9626fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 9636242a45ca50586ed3f363d4ac7422e07092e4d96Richard Smith 9646242a45ca50586ed3f363d4ac7422e07092e4d96Richard Smith if (ElemType->isReferenceType()) 9656242a45ca50586ed3f363d4ac7422e07092e4d96Richard Smith return CheckReferenceType(Entity, IList, ElemType, Index, 9666242a45ca50586ed3f363d4ac7422e07092e4d96Richard Smith StructuredList, StructuredIndex); 9676242a45ca50586ed3f363d4ac7422e07092e4d96Richard Smith 968c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 9690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!SemaRef.getLangOpts().CPlusPlus) { 970b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith InitListExpr *InnerStructuredList 97120599392a99956eaac4cf351a0935574090cb6c3Richard Smith = getStructuredSubobjectInit(IList, Index, ElemType, 97220599392a99956eaac4cf351a0935574090cb6c3Richard Smith StructuredList, StructuredIndex, 97320599392a99956eaac4cf351a0935574090cb6c3Richard Smith SubInitList->getSourceRange()); 974b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith CheckExplicitInitList(Entity, SubInitList, ElemType, 975b9bf312dabcc6ba29a9dd92f17bc0130ee12cb62Richard Smith InnerStructuredList); 97620599392a99956eaac4cf351a0935574090cb6c3Richard Smith ++StructuredIndex; 97720599392a99956eaac4cf351a0935574090cb6c3Richard Smith ++Index; 97820599392a99956eaac4cf351a0935574090cb6c3Richard Smith return; 97920599392a99956eaac4cf351a0935574090cb6c3Richard Smith } 98020599392a99956eaac4cf351a0935574090cb6c3Richard Smith // C++ initialization is handled later. 981176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (isa<ImplicitValueInitExpr>(expr)) { 982176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // This happens during template instantiation when we see an InitListExpr 983176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // that we've already checked once. 984176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(SemaRef.Context.hasSameType(expr->getType(), ElemType) && 985176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "found implicit initialization for the wrong type"); 986176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!VerifyOnly) 987176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 988176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++Index; 989176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 99020599392a99956eaac4cf351a0935574090cb6c3Richard Smith } 99120599392a99956eaac4cf351a0935574090cb6c3Richard Smith 9920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (SemaRef.getLangOpts().CPlusPlus) { 9930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // C++ [dcl.init.aggr]p2: 9940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Each member is copy-initialized from the corresponding 9950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // initializer-clause. 996fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 997fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // FIXME: Better EqualLoc? 998fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind Kind = 999fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 10000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines InitializationSequence Seq(SemaRef, Entity, Kind, expr, 10010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /*TopLevelOfInitList*/ true); 1002fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 10030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // C++14 [dcl.init.aggr]p13: 10040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If the assignment-expression can initialize a member, the member is 10050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // initialized. Otherwise [...] brace elision is assumed 10060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // 10070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Brace elision is never performed if the element is not an 10080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // assignment-expression. 10090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Seq || isa<InitListExpr>(expr)) { 101014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 1011b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith ExprResult Result = 10121f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Seq.Perform(SemaRef, Entity, Kind, expr); 1013b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith if (Result.isInvalid()) 1014b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith hadError = true; 101514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, 1017c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Result.getAs<Expr>()); 10180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else if (!Seq) 10190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines hadError = true; 1020fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 1021fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 1022fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 1023fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 1024fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 10250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else if (ElemType->isScalarType() || ElemType->isAtomicType()) { 10260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Need to handle atomic aggregate types with implicit init lists. 10270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return CheckScalarType(Entity, IList, ElemType, Index, 10280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines StructuredList, StructuredIndex); 10290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else if (const ArrayType *arrayType = 10300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SemaRef.Context.getAsArrayType(ElemType)) { 10310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // arrayType can be incomplete if we're initializing a flexible 10320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // array member. There's nothing we can do with the completed 10330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // type here, though. 10340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 10350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (IsStringInit(expr, arrayType, SemaRef.Context) == SIF_None) { 10360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!VerifyOnly) { 10370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CheckStringInit(expr, ElemType, arrayType, SemaRef); 10380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 10390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 10400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ++Index; 10410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 10420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 10430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 10440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Fall through for subaggregate initialization. 10450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1046fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 10470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert((ElemType->isRecordType() || ElemType->isVectorType()) && 10480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines "Unexpected type"); 10490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1050fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C99 6.7.8p13: 10511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 1052fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // The initializer for a structure or union object that has 1053fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // automatic storage duration shall be either an initializer 1054fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // list as described below, or a single expression that has 1055fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // compatible structure or union type. In the latter case, the 1056fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // initial value of the object, including unnamed members, is 1057fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // that of the expression. 1058c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprResult ExprRes = expr; 10590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (SemaRef.CheckSingleAssignmentConstraints( 10600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ElemType, ExprRes, !VerifyOnly) != Sema::Incompatible) { 1061429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 1062429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 1063429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley else { 1064c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.get()); 10651f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko if (ExprRes.isInvalid()) 10661f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko hadError = true; 1067429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 1068429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley UpdateStructuredListElement(StructuredList, StructuredIndex, 1069c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprRes.getAs<Expr>()); 1070930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 1071fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 1072930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 1073c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprRes.get(); 1074fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 1075fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 1076fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 1077fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C++ [dcl.init.aggr]p12: 1078fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // 1079fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // [...] Otherwise, if the member is itself a non-empty 1080fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // subaggregate, brace elision is assumed and the initializer is 1081fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // considered for the initialization of the first member of 1082fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // the subaggregate. 10834e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().OpenCL && 108461b4bc80e943578ae855810918a1dc9697dbd15bTanya Lattner (ElemType->isAggregateType() || ElemType->isVectorType())) { 1085fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 1086fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredIndex); 1087fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 1088fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 108914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 109014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // We cannot initialize this element, so let 109114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // PerformCopyInitialization produce the appropriate diagnostic. 1092c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.PerformCopyInitialization(Entity, SourceLocation(), expr, 109314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl /*TopLevelOfInitList=*/true); 109414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1095fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall hadError = true; 1096fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 1097fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 1098930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 1099b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 1100b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 11010c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedmanvoid InitListChecker::CheckComplexType(const InitializedEntity &Entity, 11020c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *IList, QualType DeclType, 11030c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &Index, 11040c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *StructuredList, 11050c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &StructuredIndex) { 11060c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman assert(Index == 0 && "Index in explicit init list must be zero"); 11070c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 11080c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // As an extension, clang supports complex initializers, which initialize 11090c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // a complex number component-wise. When an explicit initializer list for 11100c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // a complex number contains two two initializers, this extension kicks in: 11110c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // it exepcts the initializer list to contain two elements convertible to 11120c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // the element type of the complex type. The first element initializes 11130c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // the real part, and the second element intitializes the imaginary part. 11140c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 11150c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman if (IList->getNumInits() != 2) 11160c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman return CheckScalarType(Entity, IList, DeclType, Index, StructuredList, 11170c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredIndex); 11180c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 11190c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // This is an extension in C. (The builtin _Complex type does not exist 11200c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // in the C++ standard.) 11214e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus && !VerifyOnly) 11220c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman SemaRef.Diag(IList->getLocStart(), diag::ext_complex_component_init) 11230c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman << IList->getSourceRange(); 11240c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 11250c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // Initialize the complex number. 11260c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman QualType elementType = DeclType->getAs<ComplexType>()->getElementType(); 11270c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitializedEntity ElementEntity = 11280c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 11290c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 11300c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman for (unsigned i = 0; i < 2; ++i) { 11310c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman ElementEntity.setElementIndex(Index); 11320c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman CheckSubElementType(ElementEntity, IList, elementType, Index, 11330c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredList, StructuredIndex); 11340c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } 11350c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman} 11360c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 11370c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 11388ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 113946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 11406fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 11414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 11424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 1143b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Index >= IList->getNumInits()) { 11446b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith if (!VerifyOnly) 11456b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith SemaRef.Diag(IList->getLocStart(), 114680ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith SemaRef.getLangOpts().CPlusPlus11 ? 11476b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith diag::warn_cxx98_compat_empty_scalar_initializer : 11486b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith diag::err_empty_scalar_initializer) 11496b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith << IList->getSourceRange(); 115080ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith hadError = !SemaRef.getLangOpts().CPlusPlus11; 11514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 11524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 1153bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 11540cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1155b934c2d77144471f35c5ebae9e925b056dac8112John McCall 1156b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *expr = IList->getInit(Index); 1157b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) { 1158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This is invalid, and accepting it causes overload resolution 1159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // to pick the wrong overload in some corner cases. 116014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 116114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(SubIList->getLocStart(), 1162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines diag::ext_many_braces_around_scalar_init) 116314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << SubIList->getSourceRange(); 1164b934c2d77144471f35c5ebae9e925b056dac8112John McCall 1165b934c2d77144471f35c5ebae9e925b056dac8112John McCall CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList, 1166b934c2d77144471f35c5ebae9e925b056dac8112John McCall StructuredIndex); 1167b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 1168b934c2d77144471f35c5ebae9e925b056dac8112John McCall } else if (isa<DesignatedInitExpr>(expr)) { 116914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 117096a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(expr->getLocStart(), 117114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_designator_for_scalar_init) 117214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << expr->getSourceRange(); 1173b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; 1174b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 1175b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 1176b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 1177b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 1178b934c2d77144471f35c5ebae9e925b056dac8112John McCall 117914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 1180c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!SemaRef.CanPerformCopyInitialization(Entity,expr)) 118114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 118214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 118314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 118414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 118514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1186b934c2d77144471f35c5ebae9e925b056dac8112John McCall ExprResult Result = 1187c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), expr, 1188191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin /*TopLevelOfInitList=*/true); 1189b934c2d77144471f35c5ebae9e925b056dac8112John McCall 11906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *ResultExpr = nullptr; 1191b934c2d77144471f35c5ebae9e925b056dac8112John McCall 1192b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Result.isInvalid()) 1193b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; // types weren't compatible. 1194b934c2d77144471f35c5ebae9e925b056dac8112John McCall else { 1195c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ResultExpr = Result.getAs<Expr>(); 1196dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1197b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (ResultExpr != expr) { 1198b934c2d77144471f35c5ebae9e925b056dac8112John McCall // The type was promoted, update initializer list. 1199b934c2d77144471f35c5ebae9e925b056dac8112John McCall IList->setInit(Index, ResultExpr); 1200b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 1201b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 1202b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (hadError) 1203b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 1204b934c2d77144471f35c5ebae9e925b056dac8112John McCall else 1205b934c2d77144471f35c5ebae9e925b056dac8112John McCall UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 1206b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 12070cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 12080cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 12098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 12108ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 1211930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 1212930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 1213930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 121414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Index >= IList->getNumInits()) { 1215390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 1216390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 1217390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 1218390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 121914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 122014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), 122114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_init_reference_member_uninitialized) 122214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType 122314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << IList->getSourceRange(); 1224930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 1225930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 1226930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 1227930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 1228930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 122914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 123014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Expr *expr = IList->getInit(Index); 123180ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (isa<InitListExpr>(expr) && !SemaRef.getLangOpts().CPlusPlus11) { 123214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 123314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 123414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << IList->getSourceRange(); 123514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 123614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 123714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++StructuredIndex; 123814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 123914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 124014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 124114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 1242c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!SemaRef.CanPerformCopyInitialization(Entity,expr)) 124314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 124414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 124514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 124614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 124714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 124814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ExprResult Result = 1249c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), expr, 1250c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /*TopLevelOfInitList=*/true); 125114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 125214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Result.isInvalid()) 125314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 125414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1255c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines expr = Result.getAs<Expr>(); 125614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->setInit(Index, expr); 125714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 125814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (hadError) 125914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++StructuredIndex; 126014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 126114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 126214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 1263930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 1264930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 12658ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 126646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 12674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 12684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 12694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 127020e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 127120e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned maxElements = VT->getNumElements(); 127220e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numEltsInit = 0; 127320e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType elementType = VT->getElementType(); 127420e047abc5f19dc948436c0fb891450d9cd40667John McCall 12753ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Index >= IList->getNumInits()) { 12763ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Make sure the element type can be value-initialized. 12773ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 1278c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CheckEmptyInitializable( 1279c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity), 1280c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines IList->getLocEnd()); 12813ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl return; 12823ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 12833ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 12844e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().OpenCL) { 128520e047abc5f19dc948436c0fb891450d9cd40667John McCall // If the initializing element is a vector, try to copy-initialize 128620e047abc5f19dc948436c0fb891450d9cd40667John McCall // instead of breaking it apart (which is doomed to failure anyway). 128720e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *Init = IList->getInit(Index); 128820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) { 128914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 1290c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!SemaRef.CanPerformCopyInitialization(Entity, Init)) 129114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 129214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 129314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 129414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 129514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1296c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprResult Result = 1297c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.PerformCopyInitialization(Entity, Init->getLocStart(), Init, 1298c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /*TopLevelOfInitList=*/true); 129920e047abc5f19dc948436c0fb891450d9cd40667John McCall 13006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *ResultExpr = nullptr; 130120e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Result.isInvalid()) 130220e047abc5f19dc948436c0fb891450d9cd40667John McCall hadError = true; // types weren't compatible. 130320e047abc5f19dc948436c0fb891450d9cd40667John McCall else { 1304c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ResultExpr = Result.getAs<Expr>(); 1305dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 130620e047abc5f19dc948436c0fb891450d9cd40667John McCall if (ResultExpr != Init) { 130720e047abc5f19dc948436c0fb891450d9cd40667John McCall // The type was promoted, update initializer list. 130820e047abc5f19dc948436c0fb891450d9cd40667John McCall IList->setInit(Index, ResultExpr); 13092ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 13102ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 131120e047abc5f19dc948436c0fb891450d9cd40667John McCall if (hadError) 131220e047abc5f19dc948436c0fb891450d9cd40667John McCall ++StructuredIndex; 131320e047abc5f19dc948436c0fb891450d9cd40667John McCall else 131414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, 131514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ResultExpr); 131620e047abc5f19dc948436c0fb891450d9cd40667John McCall ++Index; 131720e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 13180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 13191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 132020e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 132120e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 1322dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 132320e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 132420e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 13253ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Index >= IList->getNumInits()) { 13263ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 1327c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CheckEmptyInitializable(ElementEntity, IList->getLocEnd()); 132820e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 13293ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 1330dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 133120e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 133220e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 133320e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 133420e047abc5f19dc948436c0fb891450d9cd40667John McCall } 1335c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1336c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (VerifyOnly) 1337c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return; 1338c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1339c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool isBigEndian = SemaRef.Context.getTargetInfo().isBigEndian(); 1340c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const VectorType *T = Entity.getType()->getAs<VectorType>(); 1341c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (isBigEndian && (T->getVectorKind() == VectorType::NeonVector || 1342c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines T->getVectorKind() == VectorType::NeonPolyVector)) { 1343c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // The ability to use vector initializer lists is a GNU vector extension 1344c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // and is unrelated to the NEON intrinsics in arm_neon.h. On little 1345c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // endian machines it works fine, however on big endian machines it 1346c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // exhibits surprising behaviour: 1347c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // 1348c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // uint32x2_t x = {42, 64}; 1349c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // return vget_lane_u32(x, 0); // Will return 64. 1350c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // 1351c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Because of this, explicitly call out that it is non-portable. 1352c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // 1353c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.Diag(IList->getLocStart(), 1354c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::warn_neon_vector_initializer_non_portable); 1355c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1356c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const char *typeCode; 1357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines unsigned typeSize = SemaRef.Context.getTypeSize(elementType); 1358c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1359c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (elementType->isFloatingType()) 1360c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines typeCode = "f"; 1361c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines else if (elementType->isSignedIntegerType()) 1362c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines typeCode = "s"; 1363c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines else if (elementType->isUnsignedIntegerType()) 1364c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines typeCode = "u"; 1365c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines else 1366c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm_unreachable("Invalid element type!"); 1367c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1368c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.Diag(IList->getLocStart(), 1369c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.Context.getTypeSize(VT) > 64 ? 1370c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::note_neon_vector_initializer_non_portable_q : 1371c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::note_neon_vector_initializer_non_portable) 1372c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << typeCode << typeSize; 1373c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 1374c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 137520e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 137620e047abc5f19dc948436c0fb891450d9cd40667John McCall } 137720e047abc5f19dc948436c0fb891450d9cd40667John McCall 137820e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 137920e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 1380dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 138120e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL initializers allows vectors to be constructed from vectors. 138220e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i) { 138320e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 138420e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 138520e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 1386dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 138720e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 138820e047abc5f19dc948436c0fb891450d9cd40667John McCall 138920e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType IType = IList->getInit(Index)->getType(); 139020e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!IType->isVectorType()) { 139120e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 139220e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 139320e047abc5f19dc948436c0fb891450d9cd40667John McCall ++numEltsInit; 139420e047abc5f19dc948436c0fb891450d9cd40667John McCall } else { 139520e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType VecType; 139620e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *IVT = IType->getAs<VectorType>(); 139720e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numIElts = IVT->getNumElements(); 1398dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 139920e047abc5f19dc948436c0fb891450d9cd40667John McCall if (IType->isExtVectorType()) 140020e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getExtVectorType(elementType, numIElts); 140120e047abc5f19dc948436c0fb891450d9cd40667John McCall else 140220e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getVectorType(elementType, numIElts, 1403e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson IVT->getVectorKind()); 140420e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, VecType, Index, 140520e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 140620e047abc5f19dc948436c0fb891450d9cd40667John McCall numEltsInit += numIElts; 140720e047abc5f19dc948436c0fb891450d9cd40667John McCall } 14080cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 140920e047abc5f19dc948436c0fb891450d9cd40667John McCall 141020e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL requires all elements to be initialized. 14113ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (numEltsInit != maxElements) { 14123ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!VerifyOnly) 141396a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(IList->getLocStart(), 14143ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl diag::err_vector_incorrect_num_initializers) 14153ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl << (numEltsInit < maxElements) << maxElements << numEltsInit; 14163ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl hadError = true; 14173ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 14180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 14190cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 14208ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 1421784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 142287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 14231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 14244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 14254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 14264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 1427ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType); 1428ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 14290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 14300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 14310ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (IsStringInit(IList->getInit(Index), arrayType, SemaRef.Context) == 14320ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SIF_None) { 14334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 14344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 14354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 14364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 14374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 143814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 14390ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg CheckStringInit(IList->getInit(Index), DeclType, arrayType, SemaRef); 14400ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg UpdateStructuredListElement(StructuredList, StructuredIndex, 14410ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg IList->getInit(Index)); 144214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 144314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 14440cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 14450cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 14460cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 14470cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1448ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) { 1449638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 1450638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 1451638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 145214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 145314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 145414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_variable_object_no_init) 145514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << VAT->getSizeExpr()->getSourceRange(); 1456638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 14574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 14584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 1459638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 1460638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 1461638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 146205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 14634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 14644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 146505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 1466ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) { 146705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 14689f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth()); 1469e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 147005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 147105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 147205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1473ce6c9b7da219c8640a0559f75770cfc6622de083John McCall QualType elementType = arrayType->getElementType(); 147405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 147505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 147605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 147787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 147887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 147987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 148087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 148187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 148287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 148387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 148487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 14859a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 14866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclType, nullptr, &elementIndex, Index, 1487eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 1488eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 148905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 149087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 149187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 149287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 1493f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 14949f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad maxElements = maxElements.extend(elementIndex.getBitWidth()); 1495f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 14969f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extend(maxElements.getBitWidth()); 1497e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 1498f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 149987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 150087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 150187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 150287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 150305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 150405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 150505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 150605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 150705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 150805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 150905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 15100cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 151105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 15128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 1513dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 15148ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 15158ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 15168ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 15178ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 151805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 151905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 152005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 152105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 152205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 152305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 15240cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 152514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) { 15260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 1527396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 1528e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 152905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 1530396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 1531396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 15320820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 1533396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 15340cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1535396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 1537396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 15380cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 15393ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!hadError && VerifyOnly) { 15403ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Check if there are any members of the array that get value-initialized. 15413ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // If so, check if doing that is possible. 15423ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // FIXME: This needs to detect holes left by designated initializers too. 15433ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (maxElementsKnown && elementIndex < maxElements) 1544c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CheckEmptyInitializable(InitializedEntity::InitializeElement( 1545c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SemaRef.Context, 0, Entity), 1546c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines IList->getLocEnd()); 15473ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 15480cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 15490cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1550f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedmanbool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity, 1551f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman Expr *InitExpr, 1552f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FieldDecl *Field, 1553f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool TopLevelObject) { 1554f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Handle GNU flexible array initializers. 1555f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman unsigned FlexArrayDiag; 1556f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman if (isa<InitListExpr>(InitExpr) && 1557f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman cast<InitListExpr>(InitExpr)->getNumInits() == 0) { 1558f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Empty flexible array init always allowed as an extension 1559f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::ext_flexible_array_init; 15604e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie } else if (SemaRef.getLangOpts().CPlusPlus) { 1561f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init in C++; it is not required for gcc 1562f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // compatibility, and it needs work to IRGen correctly in general. 1563f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1564f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (!TopLevelObject) { 1565f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on non-top-level object 1566f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1567f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (Entity.getKind() != InitializedEntity::EK_Variable) { 1568f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on anything which is not a variable. 1569f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1570f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) { 1571f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on local variables. 1572f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1573f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else { 1574f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Allow other cases. 1575f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::ext_flexible_array_init; 1576f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } 157714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 157814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 157996a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(InitExpr->getLocStart(), 158014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl FlexArrayDiag) 158196a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar << InitExpr->getLocStart(); 158214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 158314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << Field; 158414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1585f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman 1586f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman return FlexArrayDiag != diag::ext_flexible_array_init; 1587f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman} 1588f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman 15898ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 15902bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 15911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 159287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 15931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 15944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 15954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1596eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1597eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 15986217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 15991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1600b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1601b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1602b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 160372ab27732ea7a42d756a1e79727f86fbe391b42bRichard Smith // Assume it was supposed to consume a single initializer. 160472ab27732ea7a42d756a1e79727f86fbe391b42bRichard Smith ++Index; 1605b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1606b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 16071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16083498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 16093498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 16103ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 1611c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1612c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // If there's a default initializer, use it. 1613c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (isa<CXXRecordDecl>(RD) && cast<CXXRecordDecl>(RD)->hasInClassInitializer()) { 1614c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (VerifyOnly) 1615c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith return; 1616c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 1617c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith Field != FieldEnd; ++Field) { 1618c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (Field->hasInClassInitializer()) { 1619c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith StructuredList->setInitializedFieldInUnion(*Field); 1620c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // FIXME: Actually build a CXXDefaultInitExpr? 1621c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith return; 1622c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 1623c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 1624c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 1625c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1626176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Value-initialize the first member of the union that isn't an unnamed 1627176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // bitfield. 16283ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 16293ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl Field != FieldEnd; ++Field) { 1630176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!Field->isUnnamedBitfield()) { 16313ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 1632c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CheckEmptyInitializable( 1633c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitializedEntity::InitializeMember(*Field, &Entity), 1634c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines IList->getLocEnd()); 16353ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl else 1636581deb3da481053c4993c7600f97acf7768caac5David Blaikie StructuredList->setInitializedFieldInUnion(*Field); 16373ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl break; 16383498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 16393498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 16403498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 16413498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 16423498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 164305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 164405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 164505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 164605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 16476217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 164817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1649dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 165080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall bool CheckForMissingFields = true; 165105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 165205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 165305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 165405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 165587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 165687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 165787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 165887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 165987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 166087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 166187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 166287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 16639a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 16646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclType, &Field, nullptr, Index, 1665eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1666eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 166705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 166805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1669dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 167080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 167180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Disable check for missing fields when designators are used. 167280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // This matches gcc behaviour. 167380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall CheckForMissingFields = false; 167405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 167505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 167605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 167705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 167805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 167944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 168005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 168144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1682dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1683dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1684dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1685dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 168605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 168705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1688b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 168944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 16900bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 16914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 169205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1693b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 16940cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 169544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 169654001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 169714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool InvalidUse; 169814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 1699581deb3da481053c4993c7600f97acf7768caac5David Blaikie InvalidUse = !SemaRef.CanUseDecl(*Field); 170014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 1701581deb3da481053c4993c7600f97acf7768caac5David Blaikie InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, 170214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->getInit(Index)->getLocStart()); 170314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (InvalidUse) { 170454001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 170554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Field; 170654001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor hadError = true; 170754001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor continue; 170814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 170954001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 17108ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 1711581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity); 17128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 17138ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1714dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 17150bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 171614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DeclType->isUnionType() && !VerifyOnly) { 17170bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 1718581deb3da481053c4993c7600f97acf7768caac5David Blaikie StructuredList->setInitializedFieldInUnion(*Field); 17190bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 172005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 172105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 17220cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 172344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 172480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Emit warnings for missing struct field initializers. 172514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && InitializedSomething && CheckForMissingFields && 172614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Field != FieldEnd && !Field->getType()->isIncompleteArrayType() && 172714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !DeclType->isUnionType()) { 172880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // It is possible we have one or more unnamed bitfields remaining. 172980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Find first (if any) named field and emit warning. 173080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall for (RecordDecl::field_iterator it = Field, end = RD->field_end(); 173180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall it != end; ++it) { 1732c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (!it->isUnnamedBitfield() && !it->hasInClassInitializer()) { 173380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall SemaRef.Diag(IList->getSourceRange().getEnd(), 1734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines diag::warn_missing_field_initializers) << *it; 173580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall break; 173680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 173780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 173880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 173980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 17403ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Check that any remaining fields can be value-initialized. 17413ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly && Field != FieldEnd && !DeclType->isUnionType() && 17423ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl !Field->getType()->isIncompleteArrayType()) { 17433ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // FIXME: Should check for holes left by designated initializers too. 17443ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl for (; Field != FieldEnd && !hadError; ++Field) { 1745c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith if (!Field->isUnnamedBitfield() && !Field->hasInClassInitializer()) 1746c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CheckEmptyInitializable( 1747c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitializedEntity::InitializeMember(*Field, &Entity), 1748c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines IList->getLocEnd()); 17493ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 17503ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 17513ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 17521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1753a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1754eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1755eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1756581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field, 1757f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman TopLevelObject)) { 1758eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1759a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1760a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1761eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1762eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 17638ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 1764581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity); 1765dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 17668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 1767dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 17688ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 17698ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 1770dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1771987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 17720cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 17730cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1774ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1775ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1776ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1777ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1778ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 17801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1781a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IndirectFieldDecl *IndirectField) { 1782ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1783ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1784ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 17855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Designator, 4> Replacements; 1786a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(), 1787a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet PE = IndirectField->chain_end(); PI != PE; ++PI) { 1788a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (PI + 1 == PE) 17896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Replacements.push_back(Designator((IdentifierInfo *)nullptr, 1790ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1791ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1792ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 17936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Replacements.push_back(Designator((IdentifierInfo *)nullptr, 17946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), SourceLocation())); 1795a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(isa<FieldDecl>(*PI)); 1796a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Replacements.back().setField(cast<FieldDecl>(*PI)); 1797ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1798ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1799ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1800ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1801ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1802319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1803ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 1804a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet} 18051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 180614b0c194b356a1204d081765b3e6699687bed97cSebastian Redlstatic DesignatedInitExpr *CloneDesignatedInitExpr(Sema &SemaRef, 180714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr *DIE) { 180814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned NumIndexExprs = DIE->getNumSubExprs() - 1; 180914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SmallVector<Expr*, 4> IndexExprs(NumIndexExprs); 181014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl for (unsigned I = 0; I < NumIndexExprs; ++I) 181114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IndexExprs[I] = DIE->getSubExpr(I + 1); 181214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators_begin(), 18133b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer DIE->size(), IndexExprs, 18143b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer DIE->getEqualOrColonLoc(), 181514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->usesGNUSyntax(), DIE->getInit()); 181614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl} 181714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1818425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrainnamespace { 1819425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1820425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// Callback to only accept typo corrections that are for field members of 1821425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// the given struct or union. 1822425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrainclass FieldInitializerValidatorCCC : public CorrectionCandidateCallback { 1823425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain public: 1824425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain explicit FieldInitializerValidatorCCC(RecordDecl *RD) 1825425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain : Record(RD) {} 1826425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1827651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ValidateCandidate(const TypoCorrection &candidate) override { 1828425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>(); 1829425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain return FD && FD->getDeclContext()->getRedeclContext()->Equals(Record); 1830425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain } 1831425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1832425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain private: 1833425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain RecordDecl *Record; 1834425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain}; 1835425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1836425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain} 1837425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 183805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 183905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 184005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 184105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 184205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 184305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 18441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 18454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 184605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 184705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 184805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 184905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1850711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1851711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1852711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 185305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 185470517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko/// @param CurrentObjectType The type of the "current object" (C99 6.7.8p17), 185505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 185605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 185787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 185887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 185987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 186005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 186187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 186287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 186387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 186405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 186505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 186605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 186705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 18684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 18694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 18704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 18714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 187205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 18731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 18748ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 18759a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 187614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr *DIE, 187714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned DesigIdx, 187814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType &CurrentObjectType, 187914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl RecordDecl::field_iterator *NextField, 188014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl llvm::APSInt *NextElementIndex, 188114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned &Index, 188214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr *StructuredList, 188314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned &StructuredIndex, 1884eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1885eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1886711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 188787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 188887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 18896fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 18906fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 18916fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 18926fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 18936fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 18946fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 18956fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 18969a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 18974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 18986fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 18996fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 19006fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 19016fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 19026fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 19036fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 19046fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 190587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 190687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 190705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1908711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 190914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool IsFirstDesignator = (DesigIdx == 0); 191014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 191114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert((IsFirstDesignator || StructuredList) && 191214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "Need a non-designated initializer list to start from"); 191314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 191414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Determine the structural initializer list that corresponds to the 191514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // current subobject. 1916a789416a497b2e14e7c2fd721d03e541120bac8dBenjamin Kramer StructuredList = IsFirstDesignator? SyntacticToSemantic.lookup(IList) 191714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 191814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList, StructuredIndex, 191965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceRange(D->getLocStart(), 192065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen DIE->getLocEnd())); 192114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert(StructuredList && "Expected a structured initializer list"); 192214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 19234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 192487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 192587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 192687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 192787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 192887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 192987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 193087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 193187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 193287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 19331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 19346217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 193587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 193687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 193787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 193887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 193914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 194014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 19414e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie << SemaRef.getLangOpts().CPlusPlus << CurrentObjectType; 194287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 194387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 194487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 194587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 1946ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 1947176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!KnownField) { 1948176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines IdentifierInfo *FieldName = D->getFieldName(); 1949176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (NamedDecl *ND : Lookup) { 1951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (auto *FD = dyn_cast<FieldDecl>(ND)) { 1952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines KnownField = FD; 1953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 1954176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1955176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (auto *IFD = dyn_cast<IndirectFieldDecl>(ND)) { 195614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // In verify mode, don't modify the original. 195714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 195814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE = CloneDesignatedInitExpr(SemaRef, DIE); 1959176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IFD); 1960a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet D = DIE->getDesignator(DesigIdx); 1961176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines KnownField = cast<FieldDecl>(*IFD->chain_begin()); 1962a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet break; 1963a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1964a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1965176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!KnownField) { 1966176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (VerifyOnly) { 1967176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++Index; 1968176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; // No typo correction when just trying this out. 1969176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 197087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 1971176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Name lookup found something, but it wasn't a field. 1972176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!Lookup.empty()) { 1973176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 1974176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << FieldName; 1975176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SemaRef.Diag(Lookup.front()->getLocation(), 1976176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diag::note_field_designator_found); 1977176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++Index; 1978176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 1979176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 198014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1981176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Name lookup didn't find anything. 1982176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Determine whether this was a typo for another field name. 19832d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith if (TypoCorrection Corrected = SemaRef.CorrectTypo( 19842d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith DeclarationNameInfo(FieldName, D->getFieldLoc()), 1985176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Sema::LookupMemberName, /*Scope=*/nullptr, /*SS=*/nullptr, 1986176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::make_unique<FieldInitializerValidatorCCC>(RT->getDecl()), 1987176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Sema::CTK_ErrorRecovery, RT->getDecl())) { 19882d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith SemaRef.diagnoseTypo( 19892d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith Corrected, 19902d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith SemaRef.PDiag(diag::err_field_designator_unknown_suggest) 1991176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << FieldName << CurrentObjectType); 1992176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines KnownField = Corrected.getCorrectionDeclAs<FieldDecl>(); 1993a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer hadError = true; 1994c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1995176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Typo correction didn't find anything. 1996c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1997c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1998c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1999c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 2000c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 2001c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 2002176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 2003dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2004176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned FieldIndex = 0; 2005176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (auto *FI : RT->getDecl()->fields()) { 2006176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FI->isUnnamedBitfield()) 2007176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines continue; 2008176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (KnownField == FI) 2009176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 2010176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++FieldIndex; 201187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 20124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2013176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RecordDecl::field_iterator Field = 2014176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField)); 2015176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 20164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 20174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 20180bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 20194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 20204e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis if (!VerifyOnly) { 20214e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion(); 20224e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis if (CurrentField && CurrentField != *Field) { 20234e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis assert(StructuredList->getNumInits() == 1 20244e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis && "A union should never have more than one initializer!"); 20254e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis 20264e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis // we're about to throw away an initializer, emit warning 20274e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis SemaRef.Diag(D->getFieldLoc(), 20284e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis diag::warn_initializer_overrides) 20294e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis << D->getSourceRange(); 20304e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis Expr *ExistingInit = StructuredList->getInit(0); 20314e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis SemaRef.Diag(ExistingInit->getLocStart(), 20324e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis diag::note_previous_initializer) 20334e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis << /*FIXME:has side effects=*/0 20344e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis << ExistingInit->getSourceRange(); 20354e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis 20364e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis // remove existing initializer 20374e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis StructuredList->resizeInits(SemaRef.Context, 0); 20386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StructuredList->setInitializedFieldInUnion(nullptr); 20394e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis } 20404e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis 2041581deb3da481053c4993c7600f97acf7768caac5David Blaikie StructuredList->setInitializedFieldInUnion(*Field); 20424e49952712ff9b1b1696cb07580b2b24a3ca99e1Matthew Curtis } 20430bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 20444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 204554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 204614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool InvalidUse; 204714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 2048581deb3da481053c4993c7600f97acf7768caac5David Blaikie InvalidUse = !SemaRef.CanUseDecl(*Field); 204914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 2050581deb3da481053c4993c7600f97acf7768caac5David Blaikie InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc()); 205114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (InvalidUse) { 205254001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 205354001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor return true; 205414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 205554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 205614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 205714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Update the designator with the field declaration. 2058581deb3da481053c4993c7600f97acf7768caac5David Blaikie D->setField(*Field); 20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 206014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Make sure that our non-designated initializer list has space 206114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // for a subobject corresponding to this field. 206214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (FieldIndex >= StructuredList->getNumInits()) 206314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 206414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 20654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2066eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 2067eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 2068eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 2069711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 2070eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 2071eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 207214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 207314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr::Designator *NextD 207414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl = DIE->getDesignator(DesigIdx + 1); 207565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SemaRef.Diag(NextD->getLocStart(), 207614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_designator_into_flexible_array_member) 207765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen << SourceRange(NextD->getLocStart(), 207865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen DIE->getLocEnd()); 207914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 2080581deb3da481053c4993c7600f97acf7768caac5David Blaikie << *Field; 208114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 2082eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 2083eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 2084eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 20859046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner if (!hadError && !isa<InitListExpr>(DIE->getInit()) && 20869046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner !isa<StringLiteral>(DIE->getInit())) { 2087eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 208814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 208996a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(DIE->getInit()->getLocStart(), 209014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_flexible_array_init_needs_braces) 209114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DIE->getInit()->getSourceRange(); 209214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 2093581deb3da481053c4993c7600f97acf7768caac5David Blaikie << *Field; 209414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 2095eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 2096eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 2097eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 2098f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Check GNU flexible array initializer. 2099581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field, 2100f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman TopLevelObject)) 2101eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 2102eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 2103eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 2104eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 2105eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 2106eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 2107eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 2108eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 2109eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 2110eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 2111eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 2112eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 21138ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 21148ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 2115581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity); 21168ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 2117eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 21188ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 2119eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 2120eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 2121eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 2122eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 2123eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 2124eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 2125eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 2126eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 2127eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 2128eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 2129eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 2130262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie QualType FieldType = Field->getType(); 2131eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 2132dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 21339a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 2134581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity); 2135dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 21366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FieldType, nullptr, nullptr, Index, 21379a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 2138eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 2139eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 2140eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 214187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 214287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 214387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 214487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 21454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 214605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 214787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 214887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 214987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 215087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 215187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 21524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 215387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 215487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 215505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 215634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 215734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 215834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 2159ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 2160ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 2161ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 2162ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 216387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 216487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 2165dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 21668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 21674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 216887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 216987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 217005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 217187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 217287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 217387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 217487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 217587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 217687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 217787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 217887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 217987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 218087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 218187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 218287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 218387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 218487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 218587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 21860820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 218787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 218814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 218914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 219014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << CurrentObjectType; 219187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 219287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 219387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 219405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 21956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *IndexExpr = nullptr; 219634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 219734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 219887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 2199a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context); 220034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 220134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 220287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 22033bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 22041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 2205a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DIE->getArrayRangeStart(*D)->EvaluateKnownConstInt(SemaRef.Context); 22061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 2207a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DIE->getArrayRangeEnd(*D)->EvaluateKnownConstInt(SemaRef.Context); 220887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 220934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 2210e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // Codegen can't handle evaluating array range designators that have side 2211e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // effects, because we replicate the AST value for each initialized element. 2212e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // As such, set the sawArrayRangeDesignator() bit if we initialize multiple 2213e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // elements with something that has a side effect, so codegen can emit an 2214e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // "error unsupported" error instead of miscompiling the app. 2215e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&& 221614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly) 2217a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 221887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 221905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 222087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 222187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 22229f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 22239f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 222434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 22259f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 22269f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 222734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 222834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 2229a4e20e1e43df39e39328035c84c46fdcbbf3a01eEli Friedman if (!VerifyOnly) 223096a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(IndexExpr->getLocStart(), 223114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_array_designator_too_large) 223214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 223314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << IndexExpr->getSourceRange(); 223487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 223587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 223605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 223734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 223834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 223934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 22409f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 22419f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 22423bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 22433bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 22449f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 22459f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 224634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 224734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 224805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 22491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2250188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman if (!VerifyOnly && StructuredList->isStringLiteralInit()) { 2251188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // We're modifying a string literal init; we have to decompose the string 2252188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // so we can modify the individual characters. 2253188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman ASTContext &Context = SemaRef.Context; 2254188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman Expr *SubExpr = StructuredList->getInit(0)->IgnoreParens(); 2255188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman 2256188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // Compute the character type 2257188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman QualType CharTy = AT->getElementType(); 2258188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman 2259188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // Compute the type of the integer literals. 2260188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman QualType PromotedCharTy = CharTy; 2261188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman if (CharTy->isPromotableIntegerType()) 2262188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman PromotedCharTy = Context.getPromotedIntegerType(CharTy); 2263188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman unsigned PromotedCharTyWidth = Context.getTypeSize(PromotedCharTy); 2264188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman 2265188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman if (StringLiteral *SL = dyn_cast<StringLiteral>(SubExpr)) { 2266188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // Get the length of the string. 2267188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman uint64_t StrLen = SL->getLength(); 2268188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen)) 2269188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman StrLen = cast<ConstantArrayType>(AT)->getSize().getZExtValue(); 2270188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman StructuredList->resizeInits(Context, StrLen); 2271188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman 2272188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // Build a literal for each character in the string, and put them into 2273188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // the init list. 2274188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman for (unsigned i = 0, e = StrLen; i != e; ++i) { 2275188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i)); 2276188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman Expr *Init = new (Context) IntegerLiteral( 227781359b0a88510087a873de771f9a2f5ee7ed97d9Eli Friedman Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc()); 2278188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman if (CharTy != PromotedCharTy) 2279188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast, 22806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Init, nullptr, VK_RValue); 2281188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman StructuredList->updateInit(Context, i, Init); 2282188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman } 2283188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman } else { 2284188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman ObjCEncodeExpr *E = cast<ObjCEncodeExpr>(SubExpr); 2285188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman std::string Str; 2286188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman Context.getObjCEncodingForType(E->getEncodedType(), Str); 2287188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman 2288188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // Get the length of the string. 2289188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman uint64_t StrLen = Str.size(); 2290188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen)) 2291188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman StrLen = cast<ConstantArrayType>(AT)->getSize().getZExtValue(); 2292188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman StructuredList->resizeInits(Context, StrLen); 2293188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman 2294188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // Build a literal for each character in the string, and put them into 2295188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman // the init list. 2296188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman for (unsigned i = 0, e = StrLen; i != e; ++i) { 2297188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]); 2298188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman Expr *Init = new (Context) IntegerLiteral( 229981359b0a88510087a873de771f9a2f5ee7ed97d9Eli Friedman Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc()); 2300188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman if (CharTy != PromotedCharTy) 2301188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast, 23026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Init, nullptr, VK_RValue); 2303188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman StructuredList->updateInit(Context, i, Init); 2304188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman } 2305188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman } 2306188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman } 2307188ddb14a82792f2d9405706ae38fccb79a066fdEli Friedman 23084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 23094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 231014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && 231114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 23121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 231334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 231434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 231534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 231634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 231734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 231834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 231934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 232034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 2321dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23229a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 23238ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 23249a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 232534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 232634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 232734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 232834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 2329dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23309a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 2331dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 23326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ElementType, nullptr, nullptr, Index, 23339a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 2334eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 2335eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 233634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 233787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 233834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 233934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 234034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 234134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 234287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 234387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 234487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 234587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 234687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 234734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 23484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 234987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 235087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 23511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 235234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 235334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 235434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 235587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 235605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 2357dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 2358784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 23594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 23601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 236105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 236205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 23634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 23644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 23654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 23664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 23674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 23684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 23694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 23704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 237114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 23726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; // No structured list in verification-only mode. 23736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *ExistingInit = nullptr; 23744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 2375a789416a497b2e14e7c2fd721d03e541120bac8dBenjamin Kramer ExistingInit = SyntacticToSemantic.lookup(IList); 23764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 23774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 23781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 23804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 23814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 23824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 23834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 23844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 23854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 23864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 23871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 23884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 23894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 23901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 23914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 23924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 23934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 23941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 2395ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 23964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 239796a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(ExistingInit->getLocStart(), 23984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 239954f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 24004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 24014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 24024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 24031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 2404709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek = new (SemaRef.Context) InitListExpr(SemaRef.Context, 240562ed889272d7e9da8e367d8682fdcdeeec0d83b5Dmitri Gribenko InitRange.getBegin(), None, 2406ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitRange.getEnd()); 2407ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 24085c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman QualType ResultType = CurrentObjectType; 24095c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman if (!ResultType->isArrayType()) 24105c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman ResultType = ResultType.getNonLValueExprType(SemaRef.Context); 24115c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman Result->setType(ResultType); 24124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2413fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 2414fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 241508457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 2416f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis bool GotNumInits = false; 2417f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (!StructuredList) { 241808457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 2419f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 2420f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } else if (Index < IList->getNumInits()) { 2421f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) { 242208457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 2423f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 2424f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } 242508457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 242608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 24271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 2428fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 2429fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 2430fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 2431fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 2432fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 2433f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (GotNumInits && NumElements > NumInits) 2434fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 2435fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 2436183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 2437fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 24386217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 2439fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 2440fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 2441fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 2442fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 2443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NumElements = std::distance(RDecl->field_begin(), RDecl->field_end()); 2444fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 2445fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 2446709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Result->reserveInits(SemaRef.Context, NumElements); 2447fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 24484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 24494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 24504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 2451709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result); 24524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 24534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 24544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 24554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 24564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 24574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 24584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 24594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 24604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 24614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 24624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 24634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 24644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 24654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 24664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 24674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 24684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2469709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, 2470709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredIndex, expr)) { 24714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 247296a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(expr->getLocStart(), 24734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 24744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 247596a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(PrevInit->getLocStart(), 24764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 247754f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 24784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 24794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 24801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 24824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 24834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 248405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 2485282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// value. This is essentially just a wrapper around 24863bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 248705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 2488282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// failure. Returns the index expression, possibly with an implicit cast 2489282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// added, on success. If everything went okay, Value will receive the 2490282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// value of the constant expression. 2491282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smithstatic ExprResult 24923bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 249396a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SourceLocation Loc = Index->getLocStart(); 249405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 249505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 2496282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith ExprResult Result = S.VerifyIntegerConstantExpression(Index, &Value); 2497282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (Result.isInvalid()) 2498282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith return Result; 24993bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 25003bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 25013bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 250205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 250305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 250453d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 2505282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith return Result; 250605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 250705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 250860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 25097663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky SourceLocation Loc, 25107663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky bool GNUSyntax, 25117663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky ExprResult Init) { 251205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 251305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 251405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 25155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTDesignator, 32> Designators; 25165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Expr *, 32> InitExpressions; 251705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 251805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 251905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 252005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 252105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 252205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 25231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 252405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 252505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 252605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 252705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 252805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 252905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 2530282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!Index->isTypeDependent() && !Index->isValueDependent()) 2531c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).get(); 2532282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!Index) 253305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 253405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 253505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 25361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 253705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 253805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 253905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 254005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 254105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 254205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 254305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 254405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 254505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 254605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 254705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 25489ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 25499ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 25509ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 25519ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 2552282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!StartDependent) 2553282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith StartIndex = 2554c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CheckArrayDesignatorExpr(*this, StartIndex, StartValue).get(); 2555282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!EndDependent) 2556c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).get(); 2557282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith 2558282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!StartIndex || !EndIndex) 255905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 2560d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 2561d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 25629ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 25639ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 25649ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 25659f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad EndValue = EndValue.extend(StartValue.getBitWidth()); 2566d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 25679f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad StartValue = StartValue.extend(EndValue.getBitWidth()); 2568d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 2569c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 2570d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 25711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 2572d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 2573d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 2574d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 2575d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 25761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 2577d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 2578d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 2579d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 2580d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 2581d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 258205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 258305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 258405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 258505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 258605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 258705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 258805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 258905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 259005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 259105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 259205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 259305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 259405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 2595beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 2596beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 25973b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer InitExpressions, Loc, GNUSyntax, 2598c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Init.getAs<Expr>()); 2599dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 26004e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().C99) 26012d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor Diag(DIE->getLocStart(), diag::ext_designated_init) 26022d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor << DIE->getSourceRange(); 2603dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2604c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return DIE; 260505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 2606c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 2607cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 2608cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 2609cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 261039da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 2611dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 2612cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 2613dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi : Parent(&Parent), Index(Index) 2614cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 2615d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 2616d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 2617d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 26180c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) { 2619d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 26200c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Type = VT->getElementType(); 26210c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else { 26220c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman const ComplexType *CT = Parent.getType()->getAs<ComplexType>(); 26230c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman assert(CT && "Unexpected type"); 26240c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Kind = EK_ComplexElement; 26250c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Type = CT->getElementType(); 2626d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 262720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 262820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 26294c7736ec76fb35fe83eb4144137cf14df1c6d056Benjamin KramerInitializedEntity 26304c7736ec76fb35fe83eb4144137cf14df1c6d056Benjamin KramerInitializedEntity::InitializeBase(ASTContext &Context, 26314c7736ec76fb35fe83eb4144137cf14df1c6d056Benjamin Kramer const CXXBaseSpecifier *Base, 26324c7736ec76fb35fe83eb4144137cf14df1c6d056Benjamin Kramer bool IsInheritedVirtualBase) { 263320093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 263420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 26356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.Parent = nullptr; 2636711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base = reinterpret_cast<uintptr_t>(Base); 2637711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson if (IsInheritedVirtualBase) 2638711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base |= 0x01; 2639dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2640d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 264120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 264220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 264320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 264499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 264599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 26462651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case EK_Parameter: 26472651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case EK_Parameter_CF_Audited: { 2648f85e193739c953358c865005855253af4f68a497John McCall ParmVarDecl *D = reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2649f85e193739c953358c865005855253af4f68a497John McCall return (D ? D->getDeclName() : DeclarationName()); 2650f85e193739c953358c865005855253af4f68a497John McCall } 2651a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 2652a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 265399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 265499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 265599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 26564773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 26572434dcfb022778b06cfd257d830d0249680b87cfBill Wendling return DeclarationName(Capture.VarID); 26584773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor 265999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 266099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 266118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 266299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 266399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 2664059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2665d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2666d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 26670c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2668310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 26692624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case EK_CompoundLiteralInit: 2670f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case EK_RelatedResult: 267199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 267299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 2673dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 26747530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 267599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 267699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 26777abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 26787abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 26797abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 26807abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 26817abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 26827abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 2683f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: 26842651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case EK_Parameter_CF_Audited: 2685f85e193739c953358c865005855253af4f68a497John McCall return reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2686f85e193739c953358c865005855253af4f68a497John McCall 26877abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 26887abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 26897abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 26907abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 26917abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 2692059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2693d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2694d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 26950c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2696310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 26974773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 26982624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case EK_CompoundLiteralInit: 2699f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case EK_RelatedResult: 27006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 27017abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 2702dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 27037530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 27047abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 27057abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 27063c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregorbool InitializedEntity::allowsNRVO() const { 27073c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor switch (getKind()) { 27083c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Result: 27093c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Exception: 27103c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return LocAndNRVO.NRVO; 2711dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 27123c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Variable: 27133c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Parameter: 27142651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case EK_Parameter_CF_Audited: 27153c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Member: 27163c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_New: 27173c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Temporary: 27182624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case EK_CompoundLiteralInit: 27193c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Base: 2720059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 27213c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_ArrayElement: 27223c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_VectorElement: 27230c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2724310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 27254773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 2726f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case EK_RelatedResult: 27273c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor break; 27283c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor } 27293c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 27303c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return false; 27313c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor} 27323c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 2733211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithunsigned InitializedEntity::dumpImpl(raw_ostream &OS) const { 2734a4bb99cd0055ba0e1f3107890e5b6cbe31e6d1ccRichard Smith assert(getParent() != this); 2735211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith unsigned Depth = getParent() ? getParent()->dumpImpl(OS) : 0; 2736211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith for (unsigned I = 0; I != Depth; ++I) 2737211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith OS << "`-"; 2738211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 2739211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith switch (getKind()) { 2740211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_Variable: OS << "Variable"; break; 2741211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_Parameter: OS << "Parameter"; break; 27422651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case EK_Parameter_CF_Audited: OS << "CF audited function Parameter"; 27432651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian break; 2744211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_Result: OS << "Result"; break; 2745211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_Exception: OS << "Exception"; break; 2746211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_Member: OS << "Member"; break; 2747211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_New: OS << "New"; break; 2748211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_Temporary: OS << "Temporary"; break; 2749211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_CompoundLiteralInit: OS << "CompoundLiteral";break; 2750f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case EK_RelatedResult: OS << "RelatedResult"; break; 2751211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_Base: OS << "Base"; break; 2752211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_Delegating: OS << "Delegating"; break; 2753211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_ArrayElement: OS << "ArrayElement " << Index; break; 2754211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_VectorElement: OS << "VectorElement " << Index; break; 2755211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_ComplexElement: OS << "ComplexElement " << Index; break; 2756211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_BlockElement: OS << "Block"; break; 2757211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case EK_LambdaCapture: 2758211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith OS << "LambdaCapture "; 27592434dcfb022778b06cfd257d830d0249680b87cfBill Wendling OS << DeclarationName(Capture.VarID); 2760211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith break; 2761211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 2762211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 2763211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (Decl *D = getDecl()) { 2764211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith OS << " "; 2765211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith cast<NamedDecl>(D)->printQualifiedName(OS); 2766211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 2767211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 2768211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith OS << " '" << getType().getAsString() << "'\n"; 2769211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 2770211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return Depth + 1; 2771211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 2772211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 2773211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithvoid InitializedEntity::dump() const { 2774211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith dumpImpl(llvm::errs()); 2775211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 2776211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 277720093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 277820093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 277920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 278020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 278120093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 278220093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 278320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 278420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 2785906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 278620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 278720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 278820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 2789523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 279020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 279120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 2792906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 279320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 2794176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_AtomicConversion: 27951fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose case SK_LValueToRValue: 2796d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 279713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 279813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 279951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 2800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_ConstructorInitializationFromList: 280171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 280218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 2803cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 2804569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 2805cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 28060f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith case SK_ParenthesizedArrayInit: 2807f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 2808f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 2809f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 28102b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: 2811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_StdInitializerListConstructorCall: 281221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case SK_OCLSamplerInit: 2813e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_OCLZeroEvent: 281420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 2815dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 281620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 281713b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith case SK_ConversionSequenceNoNarrowing: 281820093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 281920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 282020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 282120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2822b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isDirectReferenceBinding() const { 28233b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return !Steps.empty() && Steps.back().Kind == SK_BindReference; 2824b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2825b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2826b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isAmbiguous() const { 2827d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 2828b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2829dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2830b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor switch (getFailureKind()) { 2831b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForReference: 2832b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitList: 2833b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 28340ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_ArrayNeedsInitListOrWideStringLiteral: 28350ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_NarrowStringIntoWideCharArray: 28360ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_WideStringIntoCharArray: 28370ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_IncompatWideStringIntoWideChar: 2838b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_AddressOfOverloadFailed: // FIXME: Could do better 2839b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 2840b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 2841b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_RValueReferenceBindingToLValue: 2842b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitDropsQualifiers: 2843b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitFailed: 2844b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConversionFailed: 2845429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 2846b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForScalar: 2847b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceBindingToInitList: 2848b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_InitListBadDestinationType: 2849b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_DefaultInitOfConst: 285072a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 2851cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 2852cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 28538713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_ListInitializationFailed: 285473076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 28555acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: 285670e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl case FK_ExplicitConstructor: 2857b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2858dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2859b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitOverloadFailed: 2860b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_UserConversionOverloadFailed: 2861b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConstructorOverloadFailed: 2862cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl case FK_ListConstructorOverloadFailed: 2863b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return FailedOverloadResult == OR_Ambiguous; 2864b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor } 2865dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 28667530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 2867b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2868b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2869d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregorbool InitializationSequence::isConstructorInitialization() const { 2870d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization; 2871d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor} 2872d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor 287322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnaravoid 287422c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence 287522c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara::AddAddressOverloadResolutionStep(FunctionDecl *Function, 287622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DeclAccessPair Found, 287722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 287820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 287920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 288020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 288122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 28829aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 28836bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.Function.FoundDecl = Found; 288420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 288520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 288620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2887dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 28885baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 288920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 28905baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 28915baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: S.Kind = SK_CastDerivedToBaseRValue; break; 28925baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break; 28935baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break; 2894906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 289520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 289620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 289720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 289820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2899dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddReferenceBindingStep(QualType T, 290020093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 290120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 290220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 290320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 290420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 290520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 290620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2907523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregorvoid InitializationSequence::AddExtraneousCopyToTemporary(QualType T) { 2908523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Step S; 2909523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Kind = SK_ExtraneousCopyToTemporary; 2910523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Type = T; 2911523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Steps.push_back(S); 2912523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor} 2913523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 291422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnaravoid 291522c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence::AddUserConversionStep(FunctionDecl *Function, 291622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DeclAccessPair FoundDecl, 291722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara QualType T, 291822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 291920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 292020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 292103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 292222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 29239aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 29249aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = FoundDecl; 292520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 292620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 292720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 292820093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 29295baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 293020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 293138a4ffe5244e6be46f1b1f8394342a77836be776John McCall S.Kind = SK_QualificationConversionRValue; // work around a gcc warning 29325baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 29335baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: 2934906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionRValue; 2935906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 29365baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: 2937906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionXValue; 2938906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 29395baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: 2940906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionLValue; 2941906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2942906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 294320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 294420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 294520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 294620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2947176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid InitializationSequence::AddAtomicConversionStep(QualType Ty) { 2948176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Step S; 2949176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S.Kind = SK_AtomicConversion; 2950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S.Type = Ty; 2951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Steps.push_back(S); 2952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 2953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 29541fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rosevoid InitializationSequence::AddLValueToRValueStep(QualType Ty) { 29551fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose assert(!Ty.hasQualifiers() && "rvalues may not have qualifiers"); 29561fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 29571fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Step S; 29581fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose S.Kind = SK_LValueToRValue; 29591fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose S.Type = Ty; 29601fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Steps.push_back(S); 29611fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose} 29621fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 296320093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 296413b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith const ImplicitConversionSequence &ICS, QualType T, 296513b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith bool TopLevelOfInitList) { 296620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 296713b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith S.Kind = TopLevelOfInitList ? SK_ConversionSequenceNoNarrowing 296813b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith : SK_ConversionSequence; 296920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 297020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 297120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 297220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 297320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2974d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2975d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2976d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2977d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2978d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2979d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2980d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2981dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 298222c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence 298322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara::AddConstructorInitializationStep(CXXConstructorDecl *Constructor, 298422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara AccessSpecifier Access, 298522c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara QualType T, 298610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates, 29876cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool FromInitList, bool AsInitList) { 298851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 2989176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S.Kind = FromInitList ? AsInitList ? SK_StdInitializerListConstructorCall 2990176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : SK_ConstructorInitializationFromList 2991176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : SK_ConstructorInitialization; 299251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 299322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 29949aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Constructor; 29959aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Constructor, Access); 299651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 299751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 299851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 299971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 300071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 300171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 300271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 300371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 300471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 300571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 300618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 300718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 300818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 300918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 301018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 301118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 301218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 3013cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 3014cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 3015cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 3016cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 3017cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 3018cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 3019cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3020569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorvoid InitializationSequence::AddObjCObjectConversionStep(QualType T) { 3021569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Step S; 3022569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Kind = SK_ObjCObjectConversion; 3023569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Type = T; 3024569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Steps.push_back(S); 3025569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 3026569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 3027cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorvoid InitializationSequence::AddArrayInitStep(QualType T) { 3028cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Step S; 3029cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Kind = SK_ArrayInit; 3030cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Type = T; 3031cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Steps.push_back(S); 3032cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 3033cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 30340f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smithvoid InitializationSequence::AddParenthesizedArrayInitStep(QualType T) { 30350f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith Step S; 30360f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith S.Kind = SK_ParenthesizedArrayInit; 30370f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith S.Type = T; 30380f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith Steps.push_back(S); 30390f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith} 30400f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith 3041f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type, 3042f85e193739c953358c865005855253af4f68a497John McCall bool shouldCopy) { 3043f85e193739c953358c865005855253af4f68a497John McCall Step s; 3044f85e193739c953358c865005855253af4f68a497John McCall s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore 3045f85e193739c953358c865005855253af4f68a497John McCall : SK_PassByIndirectRestore); 3046f85e193739c953358c865005855253af4f68a497John McCall s.Type = type; 3047f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(s); 3048f85e193739c953358c865005855253af4f68a497John McCall} 3049f85e193739c953358c865005855253af4f68a497John McCall 3050f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddProduceObjCObjectStep(QualType T) { 3051f85e193739c953358c865005855253af4f68a497John McCall Step S; 3052f85e193739c953358c865005855253af4f68a497John McCall S.Kind = SK_ProduceObjCObject; 3053f85e193739c953358c865005855253af4f68a497John McCall S.Type = T; 3054f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(S); 3055f85e193739c953358c865005855253af4f68a497John McCall} 3056f85e193739c953358c865005855253af4f68a497John McCall 30572b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redlvoid InitializationSequence::AddStdInitializerListConstructionStep(QualType T) { 30582b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Step S; 30592b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Kind = SK_StdInitializerList; 30602b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Type = T; 30612b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Steps.push_back(S); 30622b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl} 30632b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 306421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyeivoid InitializationSequence::AddOCLSamplerInitStep(QualType T) { 306521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei Step S; 306621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei S.Kind = SK_OCLSamplerInit; 306721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei S.Type = T; 306821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei Steps.push_back(S); 306921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei} 307021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 3071e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyeivoid InitializationSequence::AddOCLZeroEventStep(QualType T) { 3072e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei Step S; 3073e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei S.Kind = SK_OCLZeroEvent; 3074e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei S.Type = T; 3075e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei Steps.push_back(S); 3076e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei} 3077e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 307813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlvoid InitializationSequence::RewrapReferenceInitList(QualType T, 307913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *Syntactic) { 308013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl assert(Syntactic->getNumInits() == 1 && 308113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl "Can only rewrap trivial init lists."); 308213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Step S; 308313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Kind = SK_UnwrapInitList; 308413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Type = Syntactic->getInit(0)->getType(); 308513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Steps.insert(Steps.begin(), S); 308613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 308713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Kind = SK_RewrapInitList; 308813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Type = T; 308913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.WrappingSyntacticList = Syntactic; 309013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Steps.push_back(S); 309113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 309213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 3093dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 309420093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 30957491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(FailedSequence); 309620093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 309720093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 309820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 309920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 310020093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 310120093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 310220093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 310320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3104f85e193739c953358c865005855253af4f68a497John McCallstatic void MaybeProduceObjCObject(Sema &S, 3105f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 3106f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity) { 31074e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!S.getLangOpts().ObjCAutoRefCount) return; 3108f85e193739c953358c865005855253af4f68a497John McCall 3109f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a parameter, produce the value if it's marked 3110f85e193739c953358c865005855253af4f68a497John McCall /// __attribute__((ns_consumed)). 31112651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian if (Entity.isParameterKind()) { 3112f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.isParameterConsumed()) 3113f85e193739c953358c865005855253af4f68a497John McCall return; 3114f85e193739c953358c865005855253af4f68a497John McCall 3115f85e193739c953358c865005855253af4f68a497John McCall assert(Entity.getType()->isObjCRetainableType() && 3116f85e193739c953358c865005855253af4f68a497John McCall "consuming an object of unretainable type?"); 3117f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 3118f85e193739c953358c865005855253af4f68a497John McCall 3119f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a return value, if the return type is a 3120f85e193739c953358c865005855253af4f68a497John McCall /// retainable type, then returns need to immediately retain the 3121f85e193739c953358c865005855253af4f68a497John McCall /// object. If an autorelease is required, it will be done at the 3122f85e193739c953358c865005855253af4f68a497John McCall /// last instant. 3123f85e193739c953358c865005855253af4f68a497John McCall } else if (Entity.getKind() == InitializedEntity::EK_Result) { 3124f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.getType()->isObjCRetainableType()) 3125f85e193739c953358c865005855253af4f68a497John McCall return; 3126f85e193739c953358c865005855253af4f68a497John McCall 3127f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 3128f85e193739c953358c865005855253af4f68a497John McCall } 3129f85e193739c953358c865005855253af4f68a497John McCall} 3130f85e193739c953358c865005855253af4f68a497John McCall 31317c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithstatic void TryListInitialization(Sema &S, 31327c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith const InitializedEntity &Entity, 31337c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith const InitializationKind &Kind, 31347c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith InitListExpr *InitList, 31357c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith InitializationSequence &Sequence); 31367c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3137f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith/// \brief When initializing from init list via constructor, handle 3138f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith/// initialization of an object of type std::initializer_list<T>. 313910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// 3140f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith/// \return true if we have handled initialization of an object of type 3141f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith/// std::initializer_list<T>, false otherwise. 3142f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smithstatic bool TryInitializerListConstruction(Sema &S, 3143f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitListExpr *List, 3144f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith QualType DestType, 3145f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializationSequence &Sequence) { 3146f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith QualType E; 3147f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith if (!S.isStdInitializerList(DestType, &E)) 31481d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith return false; 31491d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith 31507c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (S.RequireCompleteType(List->getExprLoc(), E, 0)) { 31517c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Sequence.setIncompleteTypeFailure(E); 31527c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return true; 315310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 31547c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 31557c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Try initializing a temporary array from the init list. 31567c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith QualType ArrayType = S.Context.getConstantArrayType( 31577c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith E.withConst(), llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), 31587c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith List->getNumInits()), 31597c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith clang::ArrayType::Normal, 0); 31607c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith InitializedEntity HiddenArray = 31617c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith InitializedEntity::InitializeTemporary(ArrayType); 31627c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith InitializationKind Kind = 31637c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith InitializationKind::CreateDirectList(List->getExprLoc()); 31647c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith TryListInitialization(S, HiddenArray, Kind, List, Sequence); 31657c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (Sequence) 31667c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Sequence.AddStdInitializerListConstructionStep(DestType); 3167f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith return true; 316810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 316910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 317096715b288060c8e168cbca62f366c12e88c5483dSebastian Redlstatic OverloadingResult 317196715b288060c8e168cbca62f366c12e88c5483dSebastian RedlResolveConstructorOverload(Sema &S, SourceLocation DeclLoc, 31721f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko MultiExprArg Args, 317396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet &CandidateSet, 31740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclContext::lookup_result Ctors, 317596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet::iterator &Best, 317696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl bool CopyInitializing, bool AllowExplicit, 31770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool OnlyListConstructors, bool IsListInit) { 317896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl CandidateSet.clear(); 317996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 31800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (NamedDecl *D : Ctors) { 318196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 318296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl bool SuppressUserConversions = false; 318396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 318496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Find the constructor (which may be a template). 31856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXConstructorDecl *Constructor = nullptr; 318696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 318796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (ConstructorTmpl) 318896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Constructor = cast<CXXConstructorDecl>( 318996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl ConstructorTmpl->getTemplatedDecl()); 319096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl else { 319196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Constructor = cast<CXXConstructorDecl>(D); 319296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 3193867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith // C++11 [over.best.ics]p4: 31940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // ... and the constructor or user-defined conversion function is a 31950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // candidate by 31960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - 13.3.1.3, when the argument is the temporary in the second step 31970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // of a class copy-initialization, or 31980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - 13.3.1.4, 13.3.1.5, or 13.3.1.6 (in all cases), 31990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // user-defined conversion sequences are not considered. 32000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: This breaks backward compatibility, e.g. PR12117. As a 32010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // temporary fix, let's re-instate the third bullet above until 32020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // there is a resolution in the standard, i.e., 32030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - 13.3.1.7 when the initializer list has exactly one element that is 32040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // itself an initializer list and a conversion to some class X or 32050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // reference to (possibly cv-qualified) X is considered for the first 32060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // parameter of a constructor of X. 32070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if ((CopyInitializing || 32080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (IsListInit && Args.size() == 1 && isa<InitListExpr>(Args[0]))) && 320951ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl Constructor->isCopyOrMoveConstructor()) 321096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl SuppressUserConversions = true; 321196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 321296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 321396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (!Constructor->isInvalidDecl() && 321496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl (AllowExplicit || !Constructor->isExplicit()) && 32156cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl (!OnlyListConstructors || S.isInitListConstructor(Constructor))) { 321696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (ConstructorTmpl) 321796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 32186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*ExplicitArgs*/ nullptr, Args, 321951ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl CandidateSet, SuppressUserConversions); 3220ed878af7914df535b32d64f555fa118413186672Douglas Gregor else { 3221ed878af7914df535b32d64f555fa118413186672Douglas Gregor // C++ [over.match.copy]p1: 3222ed878af7914df535b32d64f555fa118413186672Douglas Gregor // - When initializing a temporary to be bound to the first parameter 3223ed878af7914df535b32d64f555fa118413186672Douglas Gregor // of a constructor that takes a reference to possibly cv-qualified 3224ed878af7914df535b32d64f555fa118413186672Douglas Gregor // T as its first argument, called with a single argument in the 3225ed878af7914df535b32d64f555fa118413186672Douglas Gregor // context of direct-initialization, explicit conversion functions 3226ed878af7914df535b32d64f555fa118413186672Douglas Gregor // are also considered. 3227ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowExplicitConv = AllowExplicit && !CopyInitializing && 32281f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Args.size() == 1 && 3229ed878af7914df535b32d64f555fa118413186672Douglas Gregor Constructor->isCopyOrMoveConstructor(); 32301f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko S.AddOverloadCandidate(Constructor, FoundDecl, Args, CandidateSet, 3231ed878af7914df535b32d64f555fa118413186672Douglas Gregor SuppressUserConversions, 3232ed878af7914df535b32d64f555fa118413186672Douglas Gregor /*PartialOverloading=*/false, 3233ed878af7914df535b32d64f555fa118413186672Douglas Gregor /*AllowExplicit=*/AllowExplicitConv); 3234ed878af7914df535b32d64f555fa118413186672Douglas Gregor } 323596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 323696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 323796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 323896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Perform overload resolution and return the result. 323996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl return CandidateSet.BestViableFunction(S, DeclLoc, Best); 324096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl} 324196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 324210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 324310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// enumerates the constructors of the initialized entity and performs overload 324410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// resolution to select the best. 32450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// \param IsListInit Is this list-initialization? 32460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// \param IsInitListCopy Is this non-list-initialization resulting from a 32470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// list-initialization from {x} where x is the same 32480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// type as the entity? 324910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstatic void TryConstructorInitialization(Sema &S, 325010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializedEntity &Entity, 325110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationKind &Kind, 32521f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko MultiExprArg Args, QualType DestType, 325310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl InitializationSequence &Sequence, 32540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool IsListInit = false, 32550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool IsInitListCopy = false) { 32560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert((!IsListInit || (Args.size() == 1 && isa<InitListExpr>(Args[0]))) && 32570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines "IsListInit must come with a single initializer list argument."); 325808ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl 325910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // The type we're constructing needs to be complete. 326010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 326169a30b838c723cb1850de55cfa48a402cfeeb6e0Douglas Gregor Sequence.setIncompleteTypeFailure(DestType); 326296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl return; 326310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 326410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 326510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const RecordType *DestRecordType = DestType->getAs<RecordType>(); 326610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl assert(DestRecordType && "Constructor initialization requires record type"); 326710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXRecordDecl *DestRecordDecl 326810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl = cast<CXXRecordDecl>(DestRecordType->getDecl()); 326910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 327096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Build the candidate set directly in the initialization sequence 327196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // structure, so that it will persist if we fail. 327296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 327396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 327496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Determine whether we are allowed to call explicit constructors or 327596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // explicit conversion operators. 32760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool AllowExplicit = Kind.AllowExplicit() || IsListInit; 32776cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool CopyInitialization = Kind.getKind() == InitializationKind::IK_Copy; 327808ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl 327910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // - Otherwise, if T is a class type, constructors are considered. The 328010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // applicable constructors are enumerated, and the best one is chosen 328110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // through overload resolution. 32820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclContext::lookup_result Ctors = S.LookupConstructors(DestRecordDecl); 328310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 32846cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl OverloadingResult Result = OR_No_Viable_Function; 328510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl OverloadCandidateSet::iterator Best; 32866cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool AsInitializerList = false; 32876cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 32880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // C++11 [over.match.list]p1, per DR1467: 32890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // When objects of non-aggregate type T are list-initialized, such that 32900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // 8.5.4 [dcl.init.list] specifies that overload resolution is performed 32910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // according to the rules in this section, overload resolution selects 32920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // the constructor in two phases: 32930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // 32946cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // - Initially, the candidate functions are the initializer-list 32956cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // constructors of the class T and the argument list consists of the 32966cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // initializer list as a single argument. 32970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (IsListInit) { 3298f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitListExpr *ILE = cast<InitListExpr>(Args[0]); 32996cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl AsInitializerList = true; 3300f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 3301f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // If the initializer list has no elements and T has a default constructor, 3302f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // the first phase is omitted. 3303e5411b7c9af683dab6b035825b71c284bfec364dRichard Smith if (ILE->getNumInits() != 0 || !DestRecordDecl->hasDefaultConstructor()) 33041f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Result = ResolveConstructorOverload(S, Kind.getLocation(), Args, 33058682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis CandidateSet, Ctors, Best, 3306f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith CopyInitialization, AllowExplicit, 3307f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith /*OnlyListConstructor=*/true, 33080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines IsListInit); 33096cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 33106cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // Time to unwrap the init list. 33111f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Args = MultiExprArg(ILE->getInits(), ILE->getNumInits()); 33126cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl } 33136cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 33146cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // C++11 [over.match.list]p1: 33156cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // - If no viable initializer-list constructor is found, overload resolution 33166cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // is performed again, where the candidate functions are all the 3317f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // constructors of the class T and the argument list consists of the 33186cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // elements of the initializer list. 33196cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl if (Result == OR_No_Viable_Function) { 33206cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl AsInitializerList = false; 33211f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Result = ResolveConstructorOverload(S, Kind.getLocation(), Args, 33228682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis CandidateSet, Ctors, Best, 33236cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl CopyInitialization, AllowExplicit, 332451ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl /*OnlyListConstructors=*/false, 33250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines IsListInit); 33266cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl } 33276cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl if (Result) { 33280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Sequence.SetOverloadFailure(IsListInit ? 3329cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitializationSequence::FK_ListConstructorOverloadFailed : 3330cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitializationSequence::FK_ConstructorOverloadFailed, 333110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Result); 333210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return; 333310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 333410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 3335f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // C++11 [dcl.init]p6: 333610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // If a program calls for the default initialization of an object 333710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // of a const-qualified type T, T shall be a class type with a 333810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // user-provided default constructor. 333910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Kind.getKind() == InitializationKind::IK_Default && 334010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Entity.getType().isConstQualified() && 33415121781d756e7814168b4255a57545d5ca497ec3Aaron Ballman !cast<CXXConstructorDecl>(Best->Function)->isUserProvided()) { 334210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 334310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return; 334410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 334510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 334670e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl // C++11 [over.match.list]p1: 334770e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl // In copy-list-initialization, if an explicit constructor is chosen, the 334870e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl // initializer is ill-formed. 334970e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function); 33500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (IsListInit && !Kind.AllowExplicit() && CtorDecl->isExplicit()) { 335170e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl Sequence.SetFailed(InitializationSequence::FK_ExplicitConstructor); 335270e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl return; 335370e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl } 335470e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl 335510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Add the constructor initialization step. Any cv-qualification conversion is 335610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // subsumed by the initialization. 335710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates = (CandidateSet.size() > 1); 33580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Sequence.AddConstructorInitializationStep( 33590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CtorDecl, Best->FoundDecl.getAccess(), DestType, HadMultipleCandidates, 33600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines IsListInit | IsInitListCopy, AsInitializerList); 336110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 336210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 336313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic bool 336413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian RedlResolveOverloadedFunctionForReferenceBinding(Sema &S, 336513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 336613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType &SourceType, 336713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType &UnqualifiedSourceType, 336813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType UnqualifiedTargetType, 336913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) { 337013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (S.Context.getCanonicalType(UnqualifiedSourceType) == 337113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Context.OverloadTy) { 337213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl DeclAccessPair Found; 337313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool HadMultipleCandidates = false; 337413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (FunctionDecl *Fn 337513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl = S.ResolveAddressOfOverloadedFunction(Initializer, 337613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl UnqualifiedTargetType, 337713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl false, Found, 337813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl &HadMultipleCandidates)) { 337913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.AddAddressOverloadResolutionStep(Fn, Found, 338013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl HadMultipleCandidates); 338113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceType = Fn->getType(); 338213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl UnqualifiedSourceType = SourceType.getUnqualifiedType(); 338313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } else if (!UnqualifiedTargetType->isRecordType()) { 338413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 338513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return true; 338613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 338713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 338813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return false; 338913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 339013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 339113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceInitializationCore(Sema &S, 339213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 339313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 339413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 339513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1, QualType T1, 339613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals, 339713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2, QualType T2, 339813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals, 339913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence); 340013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 3401f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smithstatic void TryValueInitialization(Sema &S, 3402f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith const InitializedEntity &Entity, 3403f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith const InitializationKind &Kind, 3404f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializationSequence &Sequence, 34056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines InitListExpr *InitList = nullptr); 3406f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 340713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl/// \brief Attempt list initialization of a reference. 340813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceListInitialization(Sema &S, 340913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 341013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 341113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *InitList, 3412b6e3808bfe385da8d90bb431e41e30d721d5433fRichard Smith InitializationSequence &Sequence) { 341313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // First, catch C++03 where this isn't possible. 341480ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!S.getLangOpts().CPlusPlus11) { 341513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 341613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 341713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 341813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 341913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType DestType = Entity.getType(); 342013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 342113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals; 342213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 342313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 342413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Reference initialization via an initializer list works thus: 342513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // If the initializer list consists of a single element that is 342613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // reference-related to the referenced type, bind directly to that element 342713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // (possibly creating temporaries). 342813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Otherwise, initialize a temporary with the initializer list and 342913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // bind to that. 343013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (InitList->getNumInits() == 1) { 343113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer = InitList->getInit(0); 343213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2 = Initializer->getType(); 343313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals; 343413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 343513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 343613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // If this fails, creating a temporary wouldn't work either. 343713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2, 343813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1, Sequence)) 343913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 344013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 344113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceLocation DeclLoc = Initializer->getLocStart(); 344213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool dummy1, dummy2, dummy3; 344313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sema::ReferenceCompareResult RefRelationship 344413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, dummy1, 344513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl dummy2, dummy3); 344613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (RefRelationship >= Sema::Ref_Related) { 344713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Try to bind the reference here. 344813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1, 344913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1Quals, cv2T2, T2, T2Quals, Sequence); 345013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (Sequence) 345113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.RewrapReferenceInitList(cv1T1, InitList); 345213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 345313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 345402d65ee373feb1cb029185aa0de04d0c214eda3dRichard Smith 345502d65ee373feb1cb029185aa0de04d0c214eda3dRichard Smith // Update the initializer if we've resolved an overloaded function. 345602d65ee373feb1cb029185aa0de04d0c214eda3dRichard Smith if (Sequence.step_begin() != Sequence.step_end()) 345702d65ee373feb1cb029185aa0de04d0c214eda3dRichard Smith Sequence.RewrapReferenceInitList(cv1T1, InitList); 345813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 345913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 346013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Not reference-related. Create a temporary and bind to that. 346113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 346213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 346313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryListInitialization(S, TempEntity, Kind, InitList, Sequence); 346413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (Sequence) { 346513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (DestType->isRValueReferenceType() || 346613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl (T1Quals.hasConst() && !T1Quals.hasVolatile())) 346713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 346813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl else 346913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed( 347013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 347113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 347213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 347313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 347412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola/// \brief Attempt list initialization (C++0x [dcl.init.list]) 347512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindolastatic void TryListInitialization(Sema &S, 347612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializedEntity &Entity, 347712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializationKind &Kind, 347812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitListExpr *InitList, 347912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitializationSequence &Sequence) { 348012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 348112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 348214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // C++ doesn't allow scalar initialization with more than one argument. 348314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // But C99 complex numbers are scalars and it makes sense there. 34844e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus && DestType->isScalarType() && 348514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !DestType->isAnyComplexType() && InitList->getNumInits() > 1) { 348614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 348714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 348814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 348914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DestType->isReferenceType()) { 349013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence); 349112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola return; 349214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 3493d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl 34940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (DestType->isRecordType() && 34950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines S.RequireCompleteType(InitList->getLocStart(), DestType, 0)) { 34960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Sequence.setIncompleteTypeFailure(DestType); 34970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 34980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 34990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 35000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // C++11 [dcl.init.list]p3, per DR1467: 35010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - If T is a class type and the initializer list has a single element of 35020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // type cv U, where U is T or a class derived from T, the object is 35030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // initialized from that element (by copy-initialization for 35040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // copy-list-initialization, or by direct-initialization for 35050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // direct-list-initialization). 35060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - Otherwise, if T is a character array and the initializer list has a 35070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // single element that is an appropriately-typed string literal 35080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // (8.5.2 [dcl.init.string]), initialization is performed as described 35090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // in that section. 35100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - Otherwise, if T is an aggregate, [...] (continue below). 35110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (S.getLangOpts().CPlusPlus11 && InitList->getNumInits() == 1) { 35120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (DestType->isRecordType()) { 35130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines QualType InitType = InitList->getInit(0)->getType(); 35140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (S.Context.hasSameUnqualifiedType(InitType, DestType) || 35150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines S.IsDerivedFrom(InitType, DestType)) { 35160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr *InitAsExpr = InitList->getInit(0); 35170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TryConstructorInitialization(S, Entity, Kind, InitAsExpr, DestType, 35180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Sequence, /*InitListSyntax*/ false, 35190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /*IsInitListCopy*/ true); 35200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 35210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 35220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 35230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (const ArrayType *DestAT = S.Context.getAsArrayType(DestType)) { 35240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr *SubInit[1] = {InitList->getInit(0)}; 35250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!isa<VariableArrayType>(DestAT) && 35260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines IsStringInit(SubInit[0], DestAT, S.Context) == SIF_None) { 35270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines InitializationKind SubKind = 35280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Kind.getKind() == InitializationKind::IK_DirectList 35290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ? InitializationKind::CreateDirect(Kind.getLocation(), 35300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines InitList->getLBraceLoc(), 35310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines InitList->getRBraceLoc()) 35320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines : Kind; 35330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Sequence.InitializeFrom(S, Entity, SubKind, SubInit, 35340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /*TopLevelOfInitList*/ true); 35350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 35360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // TryStringLiteralInitialization() (in InitializeFrom()) will fail if 35370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // the element is not an appropriately-typed string literal, in which 35380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // case we should proceed as in C++11 (below). 35390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Sequence) { 35400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Sequence.RewrapReferenceInitList(Entity.getType(), InitList); 35410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 3542f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith } 35430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 35440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 35450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 3546f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 35470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // C++11 [dcl.init.list]p3: 35480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - If T is an aggregate, aggregate initialization is performed. 35490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (DestType->isRecordType() && !DestType->isAggregateType()) { 35500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (S.getLangOpts().CPlusPlus11) { 35510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - Otherwise, if the initializer list has no elements and T is a 35520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // class type with a default constructor, the object is 35530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // value-initialized. 35540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (InitList->getNumInits() == 0) { 35550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CXXRecordDecl *RD = DestType->getAsCXXRecordDecl(); 35560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (RD->hasDefaultConstructor()) { 35570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TryValueInitialization(S, Entity, Kind, Sequence, InitList); 3558f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith return; 35590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 35600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 3561f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 35620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - Otherwise, if T is a specialization of std::initializer_list<E>, 35630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // an initializer_list object constructed [...] 35640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (TryInitializerListConstruction(S, InitList, DestType, Sequence)) 35650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 35660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 35670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // - Otherwise, if T is a class type, constructors are considered. 35680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr *InitListAsExpr = InitList; 35690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType, 35700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Sequence, /*InitListSyntax*/ true); 35710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else 35720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType); 35730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 357414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 35750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3576b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith if (S.getLangOpts().CPlusPlus && !DestType->isAggregateType() && 3577b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith InitList->getNumInits() == 1 && 3578b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith InitList->getInit(0)->getType()->isRecordType()) { 3579b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // - Otherwise, if the initializer list has a single element of type E 3580b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // [...references are handled above...], the object or reference is 35810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // initialized from that element (by copy-initialization for 35820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // copy-list-initialization, or by direct-initialization for 35830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // direct-list-initialization); if a narrowing conversion is required 3584b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // to convert the element to T, the program is ill-formed. 3585b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // 3586b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // Per core-24034, this is direct-initialization if we were performing 3587b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // direct-list-initialization and copy-initialization otherwise. 3588b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // We can't use InitListChecker for this, because it always performs 3589b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // copy-initialization. This only matters if we might use an 'explicit' 3590b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // conversion operator, so we only need to handle the cases where the source 3591b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith // is of record type. 3592b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith InitializationKind SubKind = 3593b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith Kind.getKind() == InitializationKind::IK_DirectList 3594b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith ? InitializationKind::CreateDirect(Kind.getLocation(), 3595b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith InitList->getLBraceLoc(), 3596b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith InitList->getRBraceLoc()) 3597b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith : Kind; 3598b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith Expr *SubInit[1] = { InitList->getInit(0) }; 3599b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith Sequence.InitializeFrom(S, Entity, SubKind, SubInit, 3600b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith /*TopLevelOfInitList*/true); 3601b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith if (Sequence) 3602b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith Sequence.RewrapReferenceInitList(Entity.getType(), InitList); 3603b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith return; 3604b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith } 360514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 360614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListChecker CheckInitList(S, Entity, InitList, 360740cba90626044ff28b58c33e743366e94c898227Richard Smith DestType, /*VerifyOnly=*/true); 360814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (CheckInitList.HadError()) { 360914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Sequence.SetFailed(InitializationSequence::FK_ListInitializationFailed); 361014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 361112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } 361212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 361314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Add the list initialization step with the built init list. 361412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.AddListInitializationStep(DestType); 361512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola} 361620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 361720093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 361820093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 361920093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 362020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 362120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 3622ed878af7914df535b32d64f555fa118413186672Douglas Gregor Expr *Initializer, 3623ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowRValues, 362420093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3625d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 362620093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 362720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 362820093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 362920093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 363020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 363120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 3632569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion; 3633f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion; 3634dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 3635569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T1, T2, DerivedToBase, 3636f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, 3637f85e193739c953358c865005855253af4f68a497John McCall ObjCLifetimeConversion) && 363820093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 363960cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 3640569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor (void)ObjCConversion; 3641f85e193739c953358c865005855253af4f68a497John McCall (void)ObjCLifetimeConversion; 3642f85e193739c953358c865005855253af4f68a497John McCall 364320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 364420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 364520093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 364620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 364720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 364820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 364920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 3650168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 3651867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding(); 3652867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith 36536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const RecordType *T1RecordType = nullptr; 36546b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) && 36556b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T1, 0)) { 365620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 365720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 365820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 3659572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall 36600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (NamedDecl *D : S.LookupConstructors(T1RecordDecl)) { 36619aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 36629aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 366320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 36646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXConstructorDecl *Constructor = nullptr; 36659aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 366620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 366720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 366820093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 366920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 36709aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 3671dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 367220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 367320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 367420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 36759aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 36766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*ExplicitArgs*/ nullptr, 367713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Initializer, CandidateSet, 3678b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 367920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 36809aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 368113a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Initializer, CandidateSet, 3682b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 368320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3684dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 368520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3686572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl()) 3687572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 3688dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const RecordType *T2RecordType = nullptr; 36906b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if ((T2RecordType = T2->getAs<RecordType>()) && 36916b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T2, 0)) { 369220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 369320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 369420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 369520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 36960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions(); 36970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) { 369820093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 369920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 370020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 370120093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 3702dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 370320093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 370420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 370520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 370620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 370720093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 37084680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Conv = cast<CXXConversionDecl>(D); 3709dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 371020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 371120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 371220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 3713dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Do we need to make sure that we only consider conversion 3714dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // candidates with reference-compatible results? That might be needed to 371520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 3716ed878af7914df535b32d64f555fa118413186672Douglas Gregor if ((AllowExplicitConvs || !Conv->isExplicit()) && 371720093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 371820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 37199aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 372086820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 3721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DestType, CandidateSet, 3722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /*AllowObjCConversionOnExplicit=*/ 3723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines false); 372420093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 37259aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 3726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Initializer, DestType, CandidateSet, 3727651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /*AllowObjCConversionOnExplicit=*/false); 372820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 372920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 373020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3731572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl()) 3732572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 3733dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 373420093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 373520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3736dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 373720093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 3738dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 37398fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) 374020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 374103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 374220093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 37433c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky // This is the overload that will be used for this initialization step if we 37443c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky // use this initialization. Mark it as referenced. 37453c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky Function->setReferenced(); 374625ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth 374703981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 374820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 3749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T2 = Function->getReturnType(); 375020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 375120093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 375203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 375303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 375422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 37559aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, 375622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara T2.getNonLValueExprType(S.Context), 375722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 375803981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 3759dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Determine whether we need to perform derived-to-base or 376003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 37615baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = VK_RValue; 3762906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl if (T2->isLValueReferenceType()) 37635baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = VK_LValue; 3764906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl else if (const RValueReferenceType *RRef = T2->getAs<RValueReferenceType>()) 37655baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue; 3766906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 376720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 3768569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool NewObjCConversion = false; 3769f85e193739c953358c865005855253af4f68a497John McCall bool NewObjCLifetimeConversion = false; 377020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 3771dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi = S.CompareReferenceRelationship(DeclLoc, T1, 37726398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context), 3773f85e193739c953358c865005855253af4f68a497John McCall NewDerivedToBase, NewObjCConversion, 3774f85e193739c953358c865005855253af4f68a497John McCall NewObjCLifetimeConversion); 3775a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor if (NewRefRelationship == Sema::Ref_Incompatible) { 3776a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // If the type we've converted to is not reference-related to the 3777a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // type we're looking for, then there is another conversion step 3778a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // we need to perform to produce a temporary of the right type 3779a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // that we'll be binding to. 3780a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ImplicitConversionSequence ICS; 3781a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.setStandard(); 3782a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.Standard = Best->FinalConversion; 3783a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor T2 = ICS.Standard.getToType(2); 3784a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor Sequence.AddConversionSequenceStep(ICS, T2); 3785a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } else if (NewDerivedToBase) 378620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 378720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 3788dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi T2.getNonReferenceType().getQualifiers()), 37895baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK); 3790569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (NewObjCConversion) 3791569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 3792569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, 3793569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T2.getNonReferenceType().getQualifiers())); 3794569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 379520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 37965baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK); 3797dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 379820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 379920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 380020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 3801dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 380283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void CheckCXX98CompatAccessibleCopy(Sema &S, 380383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const InitializedEntity &Entity, 380483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr); 380583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 3806dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Attempt reference initialization (C++0x [dcl.init.ref]) 3807dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryReferenceInitialization(Sema &S, 380820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 380920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 381020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 381120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3812d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 381320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 38145535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 38155535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 381620093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 38175535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 38185535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 38194680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 382020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 382120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 382220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 382313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2, 382413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1, Sequence)) 382513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 382613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 382713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Delegate everything else to a subfunction. 382813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1, 382913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1Quals, cv2T2, T2, T2Quals, Sequence); 383013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 38314680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 38321fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// Converts the target of reference initialization so that it has the 38331fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// appropriate qualifiers and value kind. 38341fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// 38351fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// In this case, 'x' is an 'int' lvalue, but it needs to be 'const int'. 38361fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// \code 38371fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// int x; 38381fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// const int &r = x; 38391fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// \endcode 38401fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// 38411fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// In this case the reference is binding to a bitfield lvalue, which isn't 38421fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// valid. Perform a load to create a lifetime-extended temporary instead. 38431fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// \code 38441fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// const int &r = someStruct.bitfield; 38451fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose/// \endcode 38461fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rosestatic ExprValueKind 38471fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan RoseconvertQualifiersAndValueKindIfNecessary(Sema &S, 38481fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose InitializationSequence &Sequence, 38491fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Expr *Initializer, 38501fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose QualType cv1T1, 38511fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Qualifiers T1Quals, 38521fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Qualifiers T2Quals, 38531fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose bool IsLValueRef) { 3854993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall bool IsNonAddressableType = Initializer->refersToBitField() || 38551fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Initializer->refersToVectorElement(); 38561fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 38571fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose if (IsNonAddressableType) { 38581fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose // C++11 [dcl.init.ref]p5: [...] Otherwise, the reference shall be an 38591fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose // lvalue reference to a non-volatile const type, or the reference shall be 38601fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose // an rvalue reference. 38611fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose // 38621fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose // If not, we can't make a temporary and bind to that. Give up and allow the 38631fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose // error to be diagnosed later. 38641fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose if (IsLValueRef && (!T1Quals.hasConst() || T1Quals.hasVolatile())) { 38651fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose assert(Initializer->isGLValue()); 38661fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose return Initializer->getValueKind(); 38671fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose } 38681fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 38691fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose // Force a load so we can materialize a temporary. 38701fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Sequence.AddLValueToRValueStep(cv1T1.getUnqualifiedType()); 38711fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose return VK_RValue; 38721fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose } 38731fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 38741fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose if (T1Quals != T2Quals) { 38751fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Sequence.AddQualificationConversionStep(cv1T1, 38761fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Initializer->getValueKind()); 38771fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose } 38781fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 38791fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose return Initializer->getValueKind(); 38801fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose} 38811fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 38821fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 388313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl/// \brief Reference initialization without resolving overloaded functions. 388413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceInitializationCore(Sema &S, 388513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 388613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 388713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 388813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1, QualType T1, 388913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals, 389013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2, QualType T2, 389113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals, 389213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) { 389313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType DestType = Entity.getType(); 389413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceLocation DeclLoc = Initializer->getLocStart(); 389520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 389620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 389720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 389820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 3899569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion = false; 3900f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion = false; 39014680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Expr::Classification InitCategory = Initializer->Classify(S.Context); 390220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 3903569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase, 3904f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, ObjCLifetimeConversion); 39054680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 390620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 3907dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // A reference to type "cv1 T1" is initialized by an expression of type 390820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 390920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 3910dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the reference is an lvalue reference and the initializer 391120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 3912867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith // Note the analogous bullet points for rvalue refs to functions. Because 39134680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // there are no function rvalues in C++, rvalue refs to functions are treated 39144680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // like lvalue refs. 391520093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 39164680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl bool T1Function = T1->isFunctionType(); 39174680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (isLValueRef || T1Function) { 3918dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (InitCategory.isLValue() && 391914d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 3920dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 392114d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related))) { 3922dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - is an lvalue (but is not a bit-field), and "cv1 T1" is 392320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 392420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 3925dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 392620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 3927de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 3928de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 3929de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 393020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 393120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 3932dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Context.getQualifiedType(T1, T2Quals), 39335baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue); 3934569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (ObjCConversion) 3935569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 3936569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 3937569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 39381fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose ExprValueKind ValueKind = 39391fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose convertQualifiersAndValueKindIfNecessary(S, Sequence, Initializer, 39401fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose cv1T1, T1Quals, T2Quals, 39411fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose isLValueRef); 39421fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Sequence.AddReferenceBindingStep(cv1T1, ValueKind == VK_RValue); 394320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 394420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3945dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3946dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 3947dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 3948dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 3949dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // with "cv3 T3" (this conversion is selected by enumerating the 395020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 395120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 39524680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // If we have an rvalue ref to function type here, the rhs must be 3953867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith // an rvalue. DR1287 removed the "implicitly" here. 39544680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() && 39554680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl (isLValueRef || InitCategory.isRValue())) { 3956867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith ConvOvlResult = TryRefInitWithConversionFunction( 3957867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith S, Entity, Kind, Initializer, /*AllowRValues*/isRValueRef, Sequence); 395820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 395920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 3960867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith if (ConvOvlResult != OR_No_Viable_Function) 39611d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 3962867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith InitializationSequence::FK_ReferenceInitOverloadFailed, 3963867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith ConvOvlResult); 396420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 396520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 39664680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 3967dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, the reference shall be an lvalue reference to a 396820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 396969d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor // shall be an rvalue reference. 3970b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile())) { 39713afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 39723afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 39733afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 397420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 397520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 397620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 3977b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor else 39784680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Sequence.SetFailed(InitCategory.isLValue() 397920093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 398020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 398120093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 398220093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 39834680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 398420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 398520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 39864680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 3987c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - If the initializer expression 3988c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - is an xvalue, class prvalue, array prvalue, or function lvalue and 3989c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // "cv1 T1" is reference-compatible with "cv2 T2" 3990c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // Note: functions are handled below. 3991c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (!T1Function && 399214d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 3993dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 399414d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related)) && 3995c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isXValue() || 3996c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isRecordType()) || 3997c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isArrayType()))) { 3998c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ExprValueKind ValueKind = InitCategory.isXValue()? VK_XValue : VK_RValue; 3999c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (InitCategory.isPRValue() && T2->isRecordType()) { 4000523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the 4001523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // compiler the freedom to perform a copy here or bind to the 4002523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object, while C++0x requires that we bind directly to the 4003523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object. Hence, we always bind to the object without making an 4004523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // extra copy. However, in C++03 requires that we check for the 4005523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // presence of a suitable copy constructor: 4006523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // 4007523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The constructor that would be used to make the copy shall 4008523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // be callable whether or not the copy is actually done. 400980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().MicrosoftExt) 4010523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Sequence.AddExtraneousCopyToTemporary(cv2T2); 401180ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith else if (S.getLangOpts().CPlusPlus11) 401283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CheckCXX98CompatAccessibleCopy(S, Entity, Initializer); 401320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4014dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4015c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (DerivedToBase) 4016c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddDerivedToBaseCastStep(S.Context.getQualifiedType(T1, T2Quals), 4017c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ValueKind); 4018c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor else if (ObjCConversion) 4019c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddObjCObjectConversionStep( 4020c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 4021dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 40221fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose ValueKind = convertQualifiersAndValueKindIfNecessary(S, Sequence, 40231fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Initializer, cv1T1, 40241fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose T1Quals, T2Quals, 40251fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose isLValueRef); 40261fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 40271fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose Sequence.AddReferenceBindingStep(cv1T1, ValueKind == VK_RValue); 4028dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return; 4029c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor } 4030dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4031dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 4032dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 4033c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // xvalue, class prvalue, or function lvalue of type "cv3 T3", 4034c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // where "cv1 T1" is reference-compatible with "cv3 T3", 4035867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith // 4036867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith // DR1287 removes the "implicitly" here. 4037c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T2->isRecordType()) { 403820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 4039867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith ConvOvlResult = TryRefInitWithConversionFunction( 4040867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith S, Entity, Kind, Initializer, /*AllowRValues*/true, Sequence); 404120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 404220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 4043867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith InitializationSequence::FK_ReferenceInitOverloadFailed, 4044867521c64254727a37bc9e50fa1045ef3c3b647dRichard Smith ConvOvlResult); 4045dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 404620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 404720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4048dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4049defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor if ((RefRelationship == Sema::Ref_Compatible || 4050defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor RefRelationship == Sema::Ref_Compatible_With_Added_Qualification) && 4051defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor isRValueRef && InitCategory.isLValue()) { 4052defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor Sequence.SetFailed( 4053defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 4054defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor return; 4055defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor } 4056defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor 405720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 405820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 405920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 40600099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi 40610099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // - Otherwise, a temporary of type "cv1 T1" is created and initialized 406220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 40634e47ecb6b2e399d2a7cc3a91d1eab9e501c5580fRichard Smith // copy-initialization (8.5). The reference is then bound to the 406420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 4065369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 4066369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 4067369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 40684e47ecb6b2e399d2a7cc3a91d1eab9e501c5580fRichard Smith // FIXME: Why do we use an implicit conversion here rather than trying 40694e47ecb6b2e399d2a7cc3a91d1eab9e501c5580fRichard Smith // copy-initialization? 4070f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 4071f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, TempEntity.getType(), 40724e47ecb6b2e399d2a7cc3a91d1eab9e501c5580fRichard Smith /*SuppressUserConversions=*/false, 40734e47ecb6b2e399d2a7cc3a91d1eab9e501c5580fRichard Smith /*AllowExplicit=*/false, 407414d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*FIXME:InOverloadResolution=*/false, 4075f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 4076f85e193739c953358c865005855253af4f68a497John McCall /*AllowObjCWritebackConversion=*/false); 4077f85e193739c953358c865005855253af4f68a497John McCall 4078f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isBad()) { 407920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 408020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 408120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 408220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 408318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 408418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 408518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 408618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 40873afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 40883afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 408918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 409018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 409120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 4092f85e193739c953358c865005855253af4f68a497John McCall } else { 4093f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, TempEntity.getType()); 409420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 409520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 409620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 409720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 409820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 40995535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 41005535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 4101dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship == Sema::Ref_Related && 41025535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 410320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 410420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 410520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 410620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 4107dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // [...] If T1 is reference-related to T2 and the reference is an rvalue 4108b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor // reference, the initializer expression shall not be an lvalue. 4109dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship >= Sema::Ref_Related && !isLValueRef && 4110b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitCategory.isLValue()) { 4111b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor Sequence.SetFailed( 4112b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 4113b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor return; 4114b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor } 4115dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 411620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 411720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 411820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 411920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 412020093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 4121dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// (C++ [dcl.init.string], C99 6.7.8). 4122dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryStringLiteralInitialization(Sema &S, 412320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 412420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 412520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 412620093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 4127d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 412820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 412920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 413071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 4131dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryValueInitialization(Sema &S, 413271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 413371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 4134f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializationSequence &Sequence, 4135f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitListExpr *InitList) { 4136f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith assert((!InitList || InitList->getNumInits() == 0) && 4137f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith "Shouldn't use value-init for non-empty init lists"); 4138f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 41391d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // C++98 [dcl.init]p5, C++11 [dcl.init]p7: 414071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 414171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 4142d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 4143dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 414471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 41451d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith T = S.Context.getBaseElementType(T); 4146dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 414771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 414871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 4149f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith bool NeedZeroInitialization = true; 415080ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!S.getLangOpts().CPlusPlus11) { 4151f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // C++98: 4152f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // -- if T is a class type (clause 9) with a user-declared constructor 4153f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // (12.1), then the default constructor for T is called (and the 4154f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // initialization is ill-formed if T has no accessible default 4155f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // constructor); 41561d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith if (ClassDecl->hasUserDeclaredConstructor()) 4157f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith NeedZeroInitialization = false; 41581d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith } else { 41591d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // C++11: 41601d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // -- if T is a class type (clause 9) with either no default constructor 41611d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // (12.1 [class.ctor]) or a default constructor that is user-provided 41621d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // or deleted, then the object is default-initialized; 41631d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith CXXConstructorDecl *CD = S.LookupDefaultConstructor(ClassDecl); 41641d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted()) 4165f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith NeedZeroInitialization = false; 41661d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith } 4167dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41681d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // -- if T is a (possibly cv-qualified) non-union class type without a 41691d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // user-provided or deleted default constructor, then the object is 41701d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // zero-initialized and, if T has a non-trivial default constructor, 41711d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // default-initialized; 41726678a05ba19c40d60ed68b37262942eb887be217Richard Smith // The 'non-union' here was removed by DR1502. The 'non-trivial default 41736678a05ba19c40d60ed68b37262942eb887be217Richard Smith // constructor' part was removed by DR1507. 4174f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith if (NeedZeroInitialization) 4175f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Sequence.AddZeroInitializationStep(Entity.getType()); 4176f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 4177d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // C++03: 4178d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // -- if T is a non-union class type without a user-declared constructor, 4179d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // then every non-static data member and base class component of T is 4180d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // value-initialized; 4181d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // [...] A program that calls for [...] value-initialization of an 4182d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // entity of reference type is ill-formed. 4183d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // 4184d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // C++11 doesn't need this handling, because value-initialization does not 4185d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // occur recursively there, and the implicit default constructor is 4186d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // defined as deleted in the problematic cases. 418780ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!S.getLangOpts().CPlusPlus11 && 4188d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith ClassDecl->hasUninitializedReferenceMember()) { 4189d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForReference); 4190d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return; 4191d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 4192d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 4193f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // If this is list-value-initialization, pass the empty init list on when 4194f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // building the constructor call. This affects the semantics of a few 4195f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // things (such as whether an explicit default constructor can be called). 4196f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Expr *InitListAsExpr = InitList; 41971f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko MultiExprArg Args(&InitListAsExpr, InitList ? 1 : 0); 4198f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith bool InitListSyntax = InitList; 4199f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 42001f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko return TryConstructorInitialization(S, Entity, Kind, Args, T, Sequence, 42011f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko InitListSyntax); 420271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 420371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 420471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 4205d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 420671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 420771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 420899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 420999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 421099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 421199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 421299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 421399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 4214dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 421599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 421699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 421799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 4218f85e193739c953358c865005855253af4f68a497John McCall QualType DestType = S.Context.getBaseElementType(Entity.getType()); 4219f85e193739c953358c865005855253af4f68a497John McCall 422099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 422199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 422299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 42234e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) { 422462ed889272d7e9da8e367d8682fdcdeeec0d83b5Dmitri Gribenko TryConstructorInitialization(S, Entity, Kind, None, DestType, Sequence); 42254e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth return; 422699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 4227dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 422899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 4229dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 423099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 4231dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // a const-qualified type T, T shall be a class type with a user-provided 423299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 42334e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) { 423499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 4235f85e193739c953358c865005855253af4f68a497John McCall return; 4236f85e193739c953358c865005855253af4f68a497John McCall } 4237f85e193739c953358c865005855253af4f68a497John McCall 4238f85e193739c953358c865005855253af4f68a497John McCall // If the destination type has a lifetime property, zero-initialize it. 4239f85e193739c953358c865005855253af4f68a497John McCall if (DestType.getQualifiers().hasObjCLifetime()) { 4240f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddZeroInitializationStep(Entity.getType()); 4241f85e193739c953358c865005855253af4f68a497John McCall return; 4242f85e193739c953358c865005855253af4f68a497John McCall } 424399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 424499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 424520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 424620093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 424720093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 4248dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryUserDefinedConversion(Sema &S, 4249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType DestType, 425020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 425120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 425213b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith InitializationSequence &Sequence, 425313b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith bool TopLevelOfInitList) { 42544a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 42554a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 42564a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 42574a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 4258dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 42594a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 42604a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 42614a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 42624a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 4263dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 42644a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 42654a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 4266168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 4267dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 42684a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 42694a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 42704a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 42714a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 42724a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 4273dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4274087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Try to complete the type we're converting to. 4275dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 42763bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie DeclContext::lookup_result R = S.LookupConstructors(DestRecordDecl); 42773d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie // The container holding the constructors can under certain conditions 42783d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie // be changed while iterating. To be safe we copy the lookup results 42793d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie // to a new container. 42803bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie SmallVector<NamedDecl*, 8> CopyOfCon(R.begin(), R.end()); 428109d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper for (SmallVectorImpl<NamedDecl *>::iterator 42823d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie Con = CopyOfCon.begin(), ConEnd = CopyOfCon.end(); 4283087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Con != ConEnd; ++Con) { 4284087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor NamedDecl *D = *Con; 4285087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 4286dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4287087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Find the constructor (which may be a template). 42886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXConstructorDecl *Constructor = nullptr; 4289087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 4290087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor = dyn_cast<FunctionTemplateDecl>(D); 42914a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 4292087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>( 4293087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 42944712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor else 4295087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>(D); 4296dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4297087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (!Constructor->isInvalidDecl() && 4298087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 4299087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (ConstructorTmpl) 4300087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 43016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*ExplicitArgs*/ nullptr, 430213a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Initializer, CandidateSet, 43034712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 4304087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor else 4305087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 430613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Initializer, CandidateSet, 43074712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 4308087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 4309dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 4310087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 43114a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 4312cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 4313cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 4314cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 43154a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 43164a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 43174a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 4318cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 431933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 432033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 432133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 432233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 432333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 4324dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 43250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines const auto &Conversions = 43260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SourceRecordDecl->getVisibleConversionFunctions(); 43270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) { 432833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 432933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 433033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 433133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 4332dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 433333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 433433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 43354a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 433633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 43374a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 433832daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall Conv = cast<CXXConversionDecl>(D); 4339dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 434033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 434133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 43429aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 434386820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 4344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CandidateSet, AllowExplicit); 434533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 43469aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 4347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Initializer, DestType, CandidateSet, 4348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AllowExplicit); 434933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 43504a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 43514a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 43524a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 4353dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4354dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 43554a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 43561d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 43578fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) { 43584a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 4359dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_UserConversionOverloadFailed, 43604a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 43614a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 43624a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 43631d31833450e6d2947a33cb0840d87661d92eec07John McCall 43644a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 43653c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky Function->setReferenced(); 436622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 4367dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 43684a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 43694a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 4370f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // subsumed by the initialization. Per DR5, the created temporary is of the 4371f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // cv-unqualified type of the destination. 4372f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith Sequence.AddUserConversionStep(Function, Best->FoundDecl, 4373f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith DestType.getUnqualifiedType(), 437422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 43754a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 43764a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 43774a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 43784a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 43795291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor QualType ConvType = Function->getCallResultType(); 43803fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor if (ConvType->getAs<RecordType>()) { 4381f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // If we're converting to a class type, there may be an copy of 43823fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // the resulting temporary object (possible to create an object of 43833fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // a base class type). That copy is not a separate conversion, so 43843fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // we just make a note of the actual destination type (possibly a 43853fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // base class of the type returned by the conversion function) and 43863fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // let the user-defined conversion step handle the conversion. 438722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType, 438822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 43893fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor return; 43903fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor } 43914a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 439222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType, 439322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 4394dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 43953fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If the conversion following the call to the conversion function 43963fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // is interesting, add it as a separate step. 43974a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 43984a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 43994a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 44001d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 44014a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 440213b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith Sequence.AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList); 44034a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 440420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 440520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 440687c29321c4b819d8a10f362f42fb7f7226820041Richard Smith/// An egregious hack for compatibility with libstdc++-4.2: in <tr1/hashtable>, 440787c29321c4b819d8a10f362f42fb7f7226820041Richard Smith/// a function with a pointer return type contains a 'return false;' statement. 440887c29321c4b819d8a10f362f42fb7f7226820041Richard Smith/// In C++11, 'false' is not a null pointer, so this breaks the build of any 440987c29321c4b819d8a10f362f42fb7f7226820041Richard Smith/// code using that header. 441087c29321c4b819d8a10f362f42fb7f7226820041Richard Smith/// 441187c29321c4b819d8a10f362f42fb7f7226820041Richard Smith/// Work around this by treating 'return false;' as zero-initializing the result 441287c29321c4b819d8a10f362f42fb7f7226820041Richard Smith/// if it's used in a pointer-returning function in a system header. 441387c29321c4b819d8a10f362f42fb7f7226820041Richard Smithstatic bool isLibstdcxxPointerReturnFalseHack(Sema &S, 441487c29321c4b819d8a10f362f42fb7f7226820041Richard Smith const InitializedEntity &Entity, 441587c29321c4b819d8a10f362f42fb7f7226820041Richard Smith const Expr *Init) { 441687c29321c4b819d8a10f362f42fb7f7226820041Richard Smith return S.getLangOpts().CPlusPlus11 && 441787c29321c4b819d8a10f362f42fb7f7226820041Richard Smith Entity.getKind() == InitializedEntity::EK_Result && 441887c29321c4b819d8a10f362f42fb7f7226820041Richard Smith Entity.getType()->isPointerType() && 441987c29321c4b819d8a10f362f42fb7f7226820041Richard Smith isa<CXXBoolLiteralExpr>(Init) && 442087c29321c4b819d8a10f362f42fb7f7226820041Richard Smith !cast<CXXBoolLiteralExpr>(Init)->getValue() && 442187c29321c4b819d8a10f362f42fb7f7226820041Richard Smith S.getSourceManager().isInSystemHeader(Init->getExprLoc()); 442287c29321c4b819d8a10f362f42fb7f7226820041Richard Smith} 442387c29321c4b819d8a10f362f42fb7f7226820041Richard Smith 4424f85e193739c953358c865005855253af4f68a497John McCall/// The non-zero enum values here are indexes into diagnostic alternatives. 4425f85e193739c953358c865005855253af4f68a497John McCallenum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar }; 4426f85e193739c953358c865005855253af4f68a497John McCall 4427f85e193739c953358c865005855253af4f68a497John McCall/// Determines whether this expression is an acceptable ICR source. 4428c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCallstatic InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e, 442982c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian bool isAddressOf, bool &isWeakAccess) { 4430f85e193739c953358c865005855253af4f68a497John McCall // Skip parens. 4431f85e193739c953358c865005855253af4f68a497John McCall e = e->IgnoreParens(); 4432f85e193739c953358c865005855253af4f68a497John McCall 4433f85e193739c953358c865005855253af4f68a497John McCall // Skip address-of nodes. 4434f85e193739c953358c865005855253af4f68a497John McCall if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) { 4435f85e193739c953358c865005855253af4f68a497John McCall if (op->getOpcode() == UO_AddrOf) 443682c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true, 443782c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian isWeakAccess); 4438f85e193739c953358c865005855253af4f68a497John McCall 4439f85e193739c953358c865005855253af4f68a497John McCall // Skip certain casts. 4440c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) { 4441c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall switch (ce->getCastKind()) { 4442f85e193739c953358c865005855253af4f68a497John McCall case CK_Dependent: 4443f85e193739c953358c865005855253af4f68a497John McCall case CK_BitCast: 4444f85e193739c953358c865005855253af4f68a497John McCall case CK_LValueBitCast: 4445f85e193739c953358c865005855253af4f68a497John McCall case CK_NoOp: 444682c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf, isWeakAccess); 4447f85e193739c953358c865005855253af4f68a497John McCall 4448f85e193739c953358c865005855253af4f68a497John McCall case CK_ArrayToPointerDecay: 4449f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 4450f85e193739c953358c865005855253af4f68a497John McCall 4451f85e193739c953358c865005855253af4f68a497John McCall case CK_NullToPointer: 4452f85e193739c953358c865005855253af4f68a497John McCall return IIK_okay; 4453f85e193739c953358c865005855253af4f68a497John McCall 4454f85e193739c953358c865005855253af4f68a497John McCall default: 4455f85e193739c953358c865005855253af4f68a497John McCall break; 4456f85e193739c953358c865005855253af4f68a497John McCall } 4457f85e193739c953358c865005855253af4f68a497John McCall 4458f85e193739c953358c865005855253af4f68a497John McCall // If we have a declaration reference, it had better be a local variable. 4459f4b88a45902af1802a1cb42ba48b1c474474f228John McCall } else if (isa<DeclRefExpr>(e)) { 446082c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian // set isWeakAccess to true, to mean that there will be an implicit 446182c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian // load which requires a cleanup. 446282c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian if (e->getType().getObjCLifetime() == Qualifiers::OCL_Weak) 446382c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian isWeakAccess = true; 446482c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian 4465c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (!isAddressOf) return IIK_nonlocal; 4466c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 4467f4b88a45902af1802a1cb42ba48b1c474474f228John McCall VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl()); 4468f4b88a45902af1802a1cb42ba48b1c474474f228John McCall if (!var) return IIK_nonlocal; 4469c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 4470c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal); 4471f85e193739c953358c865005855253af4f68a497John McCall 4472f85e193739c953358c865005855253af4f68a497John McCall // If we have a conditional operator, check both sides. 4473f85e193739c953358c865005855253af4f68a497John McCall } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) { 447482c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf, 447582c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian isWeakAccess)) 4476f85e193739c953358c865005855253af4f68a497John McCall return iik; 4477f85e193739c953358c865005855253af4f68a497John McCall 447882c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian return isInvalidICRSource(C, cond->getRHS(), isAddressOf, isWeakAccess); 4479f85e193739c953358c865005855253af4f68a497John McCall 4480f85e193739c953358c865005855253af4f68a497John McCall // These are never scalar. 4481f85e193739c953358c865005855253af4f68a497John McCall } else if (isa<ArraySubscriptExpr>(e)) { 4482f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 4483f85e193739c953358c865005855253af4f68a497John McCall 4484f85e193739c953358c865005855253af4f68a497John McCall // Otherwise, it needs to be a null pointer constant. 4485f85e193739c953358c865005855253af4f68a497John McCall } else { 4486f85e193739c953358c865005855253af4f68a497John McCall return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull) 4487f85e193739c953358c865005855253af4f68a497John McCall ? IIK_okay : IIK_nonlocal); 4488f85e193739c953358c865005855253af4f68a497John McCall } 4489f85e193739c953358c865005855253af4f68a497John McCall 4490f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonlocal; 4491f85e193739c953358c865005855253af4f68a497John McCall} 4492f85e193739c953358c865005855253af4f68a497John McCall 4493f85e193739c953358c865005855253af4f68a497John McCall/// Check whether the given expression is a valid operand for an 4494f85e193739c953358c865005855253af4f68a497John McCall/// indirect copy/restore. 4495f85e193739c953358c865005855253af4f68a497John McCallstatic void checkIndirectCopyRestoreSource(Sema &S, Expr *src) { 4496f85e193739c953358c865005855253af4f68a497John McCall assert(src->isRValue()); 449782c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian bool isWeakAccess = false; 449882c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian InvalidICRKind iik = isInvalidICRSource(S.Context, src, false, isWeakAccess); 449982c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian // If isWeakAccess to true, there will be an implicit 450082c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian // load which requires a cleanup. 450182c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian if (S.getLangOpts().ObjCAutoRefCount && isWeakAccess) 450282c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian S.ExprNeedsCleanups = true; 450382c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian 4504f85e193739c953358c865005855253af4f68a497John McCall if (iik == IIK_okay) return; 4505f85e193739c953358c865005855253af4f68a497John McCall 4506f85e193739c953358c865005855253af4f68a497John McCall S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback) 4507f85e193739c953358c865005855253af4f68a497John McCall << ((unsigned) iik - 1) // shift index into diagnostic explanations 4508f85e193739c953358c865005855253af4f68a497John McCall << src->getSourceRange(); 4509f85e193739c953358c865005855253af4f68a497John McCall} 4510f85e193739c953358c865005855253af4f68a497John McCall 4511cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// \brief Determine whether we have compatible array types for the 4512cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// purposes of GNU by-copy array initialization. 45130e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest, 4514cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Source) { 4515cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the source and destination array types are equivalent, we're 4516cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // done. 4517cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0))) 4518cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return true; 4519cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4520cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Make sure that the element types are the same. 4521cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!Context.hasSameType(Dest->getElementType(), Source->getElementType())) 4522cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return false; 4523cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4524cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // The only mismatch we allow is when the destination is an 4525cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // incomplete array type and the source is a constant array type. 4526cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return Source->isConstantArrayType() && Dest->isIncompleteArrayType(); 4527cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 4528cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4529f85e193739c953358c865005855253af4f68a497John McCallstatic bool tryObjCWritebackConversion(Sema &S, 4530f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 4531f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity, 4532f85e193739c953358c865005855253af4f68a497John McCall Expr *Initializer) { 4533f85e193739c953358c865005855253af4f68a497John McCall bool ArrayDecay = false; 4534f85e193739c953358c865005855253af4f68a497John McCall QualType ArgType = Initializer->getType(); 4535f85e193739c953358c865005855253af4f68a497John McCall QualType ArgPointee; 4536f85e193739c953358c865005855253af4f68a497John McCall if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) { 4537f85e193739c953358c865005855253af4f68a497John McCall ArrayDecay = true; 4538f85e193739c953358c865005855253af4f68a497John McCall ArgPointee = ArgArrayType->getElementType(); 4539f85e193739c953358c865005855253af4f68a497John McCall ArgType = S.Context.getPointerType(ArgPointee); 4540f85e193739c953358c865005855253af4f68a497John McCall } 4541f85e193739c953358c865005855253af4f68a497John McCall 4542f85e193739c953358c865005855253af4f68a497John McCall // Handle write-back conversion. 4543f85e193739c953358c865005855253af4f68a497John McCall QualType ConvertedArgType; 4544f85e193739c953358c865005855253af4f68a497John McCall if (!S.isObjCWritebackConversion(ArgType, Entity.getType(), 4545f85e193739c953358c865005855253af4f68a497John McCall ConvertedArgType)) 4546f85e193739c953358c865005855253af4f68a497John McCall return false; 4547f85e193739c953358c865005855253af4f68a497John McCall 4548f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 4549f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 4550f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 4551f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 4552f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 4553f85e193739c953358c865005855253af4f68a497John McCall 4554f85e193739c953358c865005855253af4f68a497John McCall // Do we need an lvalue conversion? 4555f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay || Initializer->isGLValue()) { 4556f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS; 4557f85e193739c953358c865005855253af4f68a497John McCall ICS.setStandard(); 4558f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.setAsIdentityConversion(); 4559f85e193739c953358c865005855253af4f68a497John McCall 4560f85e193739c953358c865005855253af4f68a497John McCall QualType ResultType; 4561f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay) { 4562f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Array_To_Pointer; 4563f85e193739c953358c865005855253af4f68a497John McCall ResultType = S.Context.getPointerType(ArgPointee); 4564f85e193739c953358c865005855253af4f68a497John McCall } else { 4565f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Lvalue_To_Rvalue; 4566f85e193739c953358c865005855253af4f68a497John McCall ResultType = Initializer->getType().getNonLValueExprType(S.Context); 4567f85e193739c953358c865005855253af4f68a497John McCall } 4568f85e193739c953358c865005855253af4f68a497John McCall 4569f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, ResultType); 4570f85e193739c953358c865005855253af4f68a497John McCall } 4571f85e193739c953358c865005855253af4f68a497John McCall 4572f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 4573f85e193739c953358c865005855253af4f68a497John McCall return true; 4574f85e193739c953358c865005855253af4f68a497John McCall} 4575f85e193739c953358c865005855253af4f68a497John McCall 457621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyeistatic bool TryOCLSamplerInitialization(Sema &S, 457721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei InitializationSequence &Sequence, 457821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei QualType DestType, 457921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei Expr *Initializer) { 458021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() || 458121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei !Initializer->isIntegerConstantExpr(S.getASTContext())) 458221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return false; 458321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 458421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei Sequence.AddOCLSamplerInitStep(DestType); 458521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return true; 458621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei} 458721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 4588e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// 4589e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// OpenCL 1.2 spec, s6.12.10 4590e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// 4591e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// The event argument can also be used to associate the 4592e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// async_work_group_copy with a previous async copy allowing 4593e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// an event to be shared by multiple async copies; otherwise 4594e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// event should be zero. 4595e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// 4596e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyeistatic bool TryOCLZeroEventInitialization(Sema &S, 4597e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei InitializationSequence &Sequence, 4598e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei QualType DestType, 4599e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei Expr *Initializer) { 4600e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei if (!S.getLangOpts().OpenCL || !DestType->isEventT() || 4601e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei !Initializer->isIntegerConstantExpr(S.getASTContext()) || 4602e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei (Initializer->EvaluateKnownConstInt(S.getASTContext()) != 0)) 4603e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return false; 4604e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 4605e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei Sequence.AddOCLZeroEventStep(DestType); 4606e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return true; 4607e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei} 4608e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 460920093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 461020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 461120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 461213b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith MultiExprArg Args, 461313b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith bool TopLevelOfInitList) 46146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : FailedCandidateSet(Kind.getLocation(), OverloadCandidateSet::CSK_Normal) { 4615b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith InitializeFrom(S, Entity, Kind, Args, TopLevelOfInitList); 4616b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith} 4617b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith 4618b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smithvoid InitializationSequence::InitializeFrom(Sema &S, 4619b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith const InitializedEntity &Entity, 4620b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith const InitializationKind &Kind, 4621b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith MultiExprArg Args, 4622b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith bool TopLevelOfInitList) { 462312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola ASTContext &Context = S.Context; 4624dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 462576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall // Eliminate non-overload placeholder types in the arguments. We 462676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall // need to do this before checking whether types are dependent 462776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall // because lowering a pseudo-object expression might well give us 462876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall // something of dependent type. 46291f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko for (unsigned I = 0, E = Args.size(); I != E; ++I) 463076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall if (Args[I]->getType()->isNonOverloadPlaceholderType()) { 463176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall // FIXME: should we be doing this here? 463276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall ExprResult result = S.CheckPlaceholderExpr(Args[I]); 463376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall if (result.isInvalid()) { 463476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SetFailed(FK_PlaceholderType); 463576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return; 463676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 4637c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Args[I] = result.get(); 463876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 463976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 464020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 4641dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // The semantics of initializers are as follows. The destination type is 4642dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // the type of the object or reference being initialized and the source 464320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 4644dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // defined when the initializer is a braced-init-list or when it is a 464520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 464612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 464720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 464812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola if (DestType->isDependentType() || 46491f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Expr::hasAnyTypeDependentArguments(Args)) { 465020093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 465120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 465220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 465320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 46547491c499e826682e128a400038361ebcbde30eecSebastian Redl // Almost everything is a normal sequence. 46557491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(NormalSequence); 46567491c499e826682e128a400038361ebcbde30eecSebastian Redl 465720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 46586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *Initializer = nullptr; 46591f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko if (Args.size() == 1) { 466020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 4661651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (S.getLangOpts().ObjC1) { 4662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (S.CheckObjCBridgeRelatedConversions(Initializer->getLocStart(), 4663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DestType, Initializer->getType(), 4664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Initializer) || 4665651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines S.ConversionToObjCStringLiteralCheck(DestType, Initializer)) 4666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args[0] = Initializer; 4667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 466820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 466920093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 467020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4671dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 46723a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl // - If the initializer is a (non-parenthesized) braced-init-list, the 46733a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl // object is list-initialized (8.5.4). 46743a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl if (Kind.getKind() != InitializationKind::IK_Direct) { 46753a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 46763a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl TryListInitialization(S, Entity, Kind, InitList, *this); 46773a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl return; 46783a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl } 467920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4680dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 468120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 468220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 468320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 468420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 468520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 468620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 468720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 46881f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko if (Args.size() != 1) 468912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForReference); 469020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 469112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 469220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 469320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4694dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 469520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 469699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 46971f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko (Kind.getKind() == InitializationKind::IK_Direct && Args.empty())) { 469812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryValueInitialization(S, Entity, Kind, *this); 469920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 470020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4701dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 470299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 47037663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky if (Kind.getKind() == InitializationKind::IK_Default) { 470412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryDefaultInitialization(S, Entity, Kind, *this); 470599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 470699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 470718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4708ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // - If the destination type is an array of characters, an array of 4709ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // char16_t, an array of char32_t, or an array of wchar_t, and the 4710ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // initializer is a string literal, see 8.5.2. 4711dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the destination type is an array, the program is 471220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 4713cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ArrayType *DestAT = Context.getAsArrayType(DestType)) { 471473076431605556fdbf28d287d084a73a24a8b8d4John McCall if (Initializer && isa<VariableArrayType>(DestAT)) { 471573076431605556fdbf28d287d084a73a24a8b8d4John McCall SetFailed(FK_VariableLengthArrayHasInitializer); 471673076431605556fdbf28d287d084a73a24a8b8d4John McCall return; 471773076431605556fdbf28d287d084a73a24a8b8d4John McCall } 471873076431605556fdbf28d287d084a73a24a8b8d4John McCall 47190ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg if (Initializer) { 47200ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg switch (IsStringInit(Initializer, DestAT, Context)) { 47210ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case SIF_None: 47220ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 47230ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return; 47240ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case SIF_NarrowStringIntoWideChar: 47250ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SetFailed(FK_NarrowStringIntoWideCharArray); 47260ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return; 47270ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case SIF_WideStringIntoChar: 47280ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SetFailed(FK_WideStringIntoCharArray); 47290ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return; 47300ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case SIF_IncompatWideStringIntoWideChar: 47310ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SetFailed(FK_IncompatWideStringIntoWideChar); 47320ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg return; 47330ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case SIF_Other: 47340ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 47350ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg } 4736ce6c9b7da219c8640a0559f75770cfc6622de083John McCall } 4737ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 4738cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Note: as an GNU C extension, we allow initialization of an 4739cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // array from a compound literal that creates an array of the same 4740cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type, so long as the initializer has no side effects. 47414e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!S.getLangOpts().CPlusPlus && Initializer && 4742cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) && 4743cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Initializer->getType()->isArrayType()) { 4744cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *SourceAT 4745cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = Context.getAsArrayType(Initializer->getType()); 4746cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT)) 474712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayTypeMismatch); 4748cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else if (Initializer->HasSideEffects(S.Context)) 474912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_NonConstantArrayInit); 4750cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else { 475112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddArrayInitStep(DestType); 4752cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 47530f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith } 4754f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // Note: as a GNU C++ extension, we allow list-initialization of a 4755f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // class member of array type from a parenthesized initializer list. 47564e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (S.getLangOpts().CPlusPlus && 47570f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith Entity.getKind() == InitializedEntity::EK_Member && 47580f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith Initializer && isa<InitListExpr>(Initializer)) { 47590f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith TryListInitialization(S, Entity, Kind, cast<InitListExpr>(Initializer), 47600f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith *this); 47610f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith AddParenthesizedArrayInitStep(DestType); 47620ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg } else if (DestAT->getElementType()->isCharType()) 476312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 47640ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg else if (IsWideCharCompatible(DestAT->getElementType(), Context)) 47650ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg SetFailed(FK_ArrayNeedsInitListOrWideStringLiteral); 476620093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 476712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitList); 4768dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 476920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 477020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4771cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 47720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Determine whether we should consider writeback conversions for 4773f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC. 47744e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie bool allowObjCWritebackConversion = S.getLangOpts().ObjCAutoRefCount && 47752651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian Entity.isParameterKind(); 4776f85e193739c953358c865005855253af4f68a497John McCall 4777f85e193739c953358c865005855253af4f68a497John McCall // We're at the end of the line for C: it's either a write-back conversion 4778f85e193739c953358c865005855253af4f68a497John McCall // or it's a C assignment. There's no need to check anything else. 47794e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!S.getLangOpts().CPlusPlus) { 4780f85e193739c953358c865005855253af4f68a497John McCall // If allowed, check whether this is an Objective-C writeback conversion. 4781f85e193739c953358c865005855253af4f68a497John McCall if (allowObjCWritebackConversion && 478212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola tryObjCWritebackConversion(S, *this, Entity, Initializer)) { 4783f85e193739c953358c865005855253af4f68a497John McCall return; 4784f85e193739c953358c865005855253af4f68a497John McCall } 478521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 478621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei if (TryOCLSamplerInitialization(S, *this, DestType, Initializer)) 478721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return; 4788e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 4789e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei if (TryOCLZeroEventInitialization(S, *this, DestType, Initializer)) 4790e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return; 4791e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 4792f85e193739c953358c865005855253af4f68a497John McCall // Handle initialization in C 479312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddCAssignmentStep(DestType); 479412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 4795cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 4796cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 4797dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 47984e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie assert(S.getLangOpts().CPlusPlus); 4799f85e193739c953358c865005855253af4f68a497John McCall 480020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 480120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 4802dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initialization is direct-initialization, or if it is 4803dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy-initialization where the cv-unqualified version of the 4804dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // source type is the same class as, or a derived class of, the 480520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 480620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 480720093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 480820093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 480920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 48101f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko TryConstructorInitialization(S, Entity, Kind, Args, 4811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DestType, *this); 4812dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise (i.e., for the remaining copy-initialization cases), 481320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 4814dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // type to the destination type or (when a conversion function is 481520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 481620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 481720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 481820093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 4819176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TryUserDefinedConversion(S, DestType, Kind, Initializer, *this, 482013b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith TopLevelOfInitList); 482120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 482220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4823dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 48241f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko if (Args.size() > 1) { 482512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForScalar); 482699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 482799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 48281f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko assert(Args.size() == 1 && "Zero-argument case handled above"); 4829dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4830dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the source type is a (possibly cv-qualified) class 483120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 483299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 4833176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // For a conversion to _Atomic(T) from either T or a class type derived 4834176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // from T, initialize the T object then convert to _Atomic type. 4835176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool NeedAtomicConversion = false; 4836176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (const AtomicType *Atomic = DestType->getAs<AtomicType>()) { 4837176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Context.hasSameUnqualifiedType(SourceType, Atomic->getValueType()) || 4838176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S.IsDerivedFrom(SourceType, Atomic->getValueType())) { 4839176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DestType = Atomic->getValueType(); 4840176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines NeedAtomicConversion = true; 4841176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 4842176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 4843176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4844176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TryUserDefinedConversion(S, DestType, Kind, Initializer, *this, 484513b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith TopLevelOfInitList); 484612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 4847176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!Failed() && NeedAtomicConversion) 4848176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddAtomicConversionStep(Entity.getType()); 484920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 485020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4851dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 485220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 48534a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 485420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 4855dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // initializer expression to the cv-unqualified version of the 485620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 4857176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4858f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 4859176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines = S.TryImplicitConversion(Initializer, DestType, 4860f85e193739c953358c865005855253af4f68a497John McCall /*SuppressUserConversions*/true, 4861369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*AllowExplicitConversions*/ false, 486214d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*InOverloadResolution*/ false, 4863f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 4864f85e193739c953358c865005855253af4f68a497John McCall allowObjCWritebackConversion); 4865176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4866176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (ICS.isStandard() && 4867f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.Second == ICK_Writeback_Conversion) { 4868f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC writeback conversion. 4869f85e193739c953358c865005855253af4f68a497John McCall 4870f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 4871f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 4872f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 4873f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 4874f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 4875f85e193739c953358c865005855253af4f68a497John McCall 4876f85e193739c953358c865005855253af4f68a497John McCall // If there was an lvalue adjustment, add it as a separate conversion. 4877f85e193739c953358c865005855253af4f68a497John McCall if (ICS.Standard.First == ICK_Array_To_Pointer || 4878f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First == ICK_Lvalue_To_Rvalue) { 4879f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence LvalueICS; 4880f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.setStandard(); 4881f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAsIdentityConversion(); 4882f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0)); 4883f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.First = ICS.Standard.First; 488412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0)); 4885f85e193739c953358c865005855253af4f68a497John McCall } 488612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 4887176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddPassByIndirectCopyRestoreStep(DestType, ShouldCopy); 4888f85e193739c953358c865005855253af4f68a497John McCall } else if (ICS.isBad()) { 48891be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor DeclAccessPair dap; 489087c29321c4b819d8a10f362f42fb7f7226820041Richard Smith if (isLibstdcxxPointerReturnFalseHack(S, Entity, Initializer)) { 489187c29321c4b819d8a10f362f42fb7f7226820041Richard Smith AddZeroInitializationStep(Entity.getType()); 489287c29321c4b819d8a10f362f42fb7f7226820041Richard Smith } else if (Initializer->getType() == Context.OverloadTy && 489387c29321c4b819d8a10f362f42fb7f7226820041Richard Smith !S.ResolveAddressOfOverloadedFunction(Initializer, DestType, 489487c29321c4b819d8a10f362f42fb7f7226820041Richard Smith false, dap)) 489512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 48968e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor else 489712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_ConversionFailed); 4898f85e193739c953358c865005855253af4f68a497John McCall } else { 4899176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList); 4900856d3798af7c2f7251e4a295f3da7a09ce4c62abJohn McCall 490112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 49028e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor } 490320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 490420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 490520093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 49065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner for (SmallVectorImpl<Step>::iterator Step = Steps.begin(), 490720093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 490820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 490920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 491020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 491120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 491220093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 491320093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 491420093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 4915dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic Sema::AssignmentAction 49163d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz JahaniangetAssignmentAction(const InitializedEntity &Entity, bool Diagnose = false) { 491718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 491818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 491918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 4920a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Exception: 4921a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Base: 4922059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 492318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 492418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 492518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 4926dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (Entity.getDecl() && 4927688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext())) 4928688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor return Sema::AA_Sending; 4929688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor 493018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 493118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 49323d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz Jahanian case InitializedEntity::EK_Parameter_CF_Audited: 49333d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz Jahanian if (Entity.getDecl() && 49343d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz Jahanian isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext())) 49353d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz Jahanian return Sema::AA_Sending; 49363d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz Jahanian 49373d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz Jahanian return !Diagnose ? Sema::AA_Passing : Sema::AA_Passing_CFAudited; 49383d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz Jahanian 493918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 494018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 494118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 494218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 4943f5200d6865fc5867ee022f876d2cdee94b48b1eeFariborz Jahanian case InitializedEntity::EK_RelatedResult: 494418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 494518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 4946dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 494718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 4948d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 4949d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 49500c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4951310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 49524773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 49532624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializedEntity::EK_CompoundLiteralInit: 495418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 495518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 495618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 49577530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 495818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 495918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4960774d8b4679ce1317da0f18336c3d27bdb11e5f63Richard Smith/// \brief Whether we should bind a created object as a temporary when 49614154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// initializing the given entity. 49622f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity) { 496318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 49641b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 49651b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 49662f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_Result: 496718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 496818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 496918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 4970059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 4971d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 49720c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4973a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson case InitializedEntity::EK_Exception: 4974310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 49754773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 49762624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializedEntity::EK_CompoundLiteralInit: 497718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 4978dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 497918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 49802651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case InitializedEntity::EK_Parameter_CF_Audited: 498118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 4982f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case InitializedEntity::EK_RelatedResult: 498318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 498418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 4985dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 498618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 498718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 498818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 49894154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether the given entity, when initialized with an object 49904154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// created for that initialization, requires destruction. 49914154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregorstatic bool shouldDestroyTemporary(const InitializedEntity &Entity) { 49924154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor switch (Entity.getKind()) { 49934154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Result: 49944154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_New: 49954154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Base: 4996059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 49974154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_VectorElement: 49980c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4999310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 50004773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 50014154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return false; 5002dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5003774d8b4679ce1317da0f18336c3d27bdb11e5f63Richard Smith case InitializedEntity::EK_Member: 50044154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Variable: 50054154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Parameter: 50062651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case InitializedEntity::EK_Parameter_CF_Audited: 50074154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Temporary: 50084154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_ArrayElement: 50094154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Exception: 50102624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializedEntity::EK_CompoundLiteralInit: 5011f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case InitializedEntity::EK_RelatedResult: 50124154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return true; 50134154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 5014dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5015dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi llvm_unreachable("missed an InitializedEntity kind?"); 50164154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor} 50174154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 501883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Look for copy and move constructors and constructor templates, for 501983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// copying an object via direct-initialization (per C++11 [dcl.init]p16). 502083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void LookupCopyAndMoveConstructors(Sema &S, 502183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet &CandidateSet, 502283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CXXRecordDecl *Class, 502383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr) { 50243bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie DeclContext::lookup_result R = S.LookupConstructors(Class); 50258682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // The container holding the constructors can under certain conditions 50268682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // be changed while iterating (e.g. because of deserialization). 50278682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // To be safe we copy the lookup results to a new container. 50283bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie SmallVector<NamedDecl*, 16> Ctors(R.begin(), R.end()); 502909d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper for (SmallVectorImpl<NamedDecl *>::iterator 50308682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis CI = Ctors.begin(), CE = Ctors.end(); CI != CE; ++CI) { 50318682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis NamedDecl *D = *CI; 50326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXConstructorDecl *Constructor = nullptr; 503383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 50348682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis if ((Constructor = dyn_cast<CXXConstructorDecl>(D))) { 503583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Handle copy/moveconstructors, only. 503683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Constructor || Constructor->isInvalidDecl() || 503783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith !Constructor->isCopyOrMoveConstructor() || 503883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith !Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 503983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 504083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 504183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclAccessPair FoundDecl 504283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith = DeclAccessPair::make(Constructor, Constructor->getAccess()); 504383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.AddOverloadCandidate(Constructor, FoundDecl, 504413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CurInitExpr, CandidateSet); 504583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 504683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 504783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 504883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Handle constructor templates. 50498682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis FunctionTemplateDecl *ConstructorTmpl = cast<FunctionTemplateDecl>(D); 505083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (ConstructorTmpl->isInvalidDecl()) 505183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 505283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 505383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Constructor = cast<CXXConstructorDecl>( 505483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith ConstructorTmpl->getTemplatedDecl()); 505583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 505683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 505783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 505883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // FIXME: Do we need to limit this to copy-constructor-like 505983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // candidates? 506083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclAccessPair FoundDecl 506183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith = DeclAccessPair::make(ConstructorTmpl, ConstructorTmpl->getAccess()); 50626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, nullptr, 506313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CurInitExpr, CandidateSet, true); 506483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 506583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 506683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 506783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Get the location at which initialization diagnostics should appear. 506883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic SourceLocation getInitializationLoc(const InitializedEntity &Entity, 506983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *Initializer) { 507083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith switch (Entity.getKind()) { 507183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Result: 507283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getReturnLoc(); 507383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 507483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Exception: 507583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getThrowLoc(); 507683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 507783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Variable: 507883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getDecl()->getLocation(); 507983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 50804773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 50814773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor return Entity.getCaptureLoc(); 50824773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor 508383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_ArrayElement: 508483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Member: 508583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Parameter: 50862651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case InitializedEntity::EK_Parameter_CF_Audited: 508783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Temporary: 508883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_New: 508983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Base: 509083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Delegating: 509183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_VectorElement: 509283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_ComplexElement: 509383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_BlockElement: 50942624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializedEntity::EK_CompoundLiteralInit: 5095f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case InitializedEntity::EK_RelatedResult: 509683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Initializer->getLocStart(); 509783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 509883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith llvm_unreachable("missed an InitializedEntity kind?"); 509983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 510083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 5101523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \brief Make a (potentially elidable) temporary copy of the object 5102523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// provided by the given initializer by calling the appropriate copy 5103523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// constructor. 5104523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 5105523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param S The Sema object used for type-checking. 5106523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 510763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// \param T The type of the temporary object, which must either be 5108523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// the type of the initializer expression or a superclass thereof. 5109523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 51101dfbd92c83699820bfaa352e83083124e34fc9dcJames Dennett/// \param Entity The entity being initialized. 5111523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 5112523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param CurInit The initializer expression. 5113523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 5114523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param IsExtraneousCopy Whether this is an "extraneous" copy that 5115523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// is permitted in C++03 (but not C++0x) when binding a reference to 5116523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// an rvalue. 5117523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 5118523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \returns An expression that copies the initializer expression into 5119523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// a temporary object, or an error expression if a copy could not be 5120523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// created. 512160d7b3a319d84d688752be3870615ac0f111fb16John McCallstatic ExprResult CopyObject(Sema &S, 51228fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor QualType T, 51238fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor const InitializedEntity &Entity, 51248fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor ExprResult CurInit, 51258fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor bool IsExtraneousCopy) { 51260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (CurInit.isInvalid()) 51270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return CurInit; 51283fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine which class type we're copying to. 51291b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 51306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXRecordDecl *Class = nullptr; 5131523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) 51322f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 51332f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (!Class) 51343fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 51352f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 5136f5d8f466c3eebaffc51468812bdcbe7f0fe4891aDouglas Gregor // C++0x [class.copy]p32: 51372f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // When certain criteria are met, an implementation is allowed to 51382f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // omit the copy/move construction of a class object, even if the 51392f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // copy/move constructor and/or destructor for the object have 51402f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // side effects. [...] 51412f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // - when a temporary class object that has not been bound to a 51422f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // reference (12.2) would be copied/moved to a class object 51432f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // with the same cv-unqualified type, the copy/move operation 51442f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // can be omitted by constructing the temporary object 51452f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // directly into the target of the omitted copy/move 5146dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // 51472f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // Note that the other three bullets are handled elsewhere. Copy 51483c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // elision for return statements and throw expressions are handled as part 5149dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // of constructor initialization, while copy elision for exception handlers 51503c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // is handled by the run-time. 5151558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall bool Elidable = CurInitExpr->isTemporaryObject(S.Context, Class); 515283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith SourceLocation Loc = getInitializationLoc(Entity, CurInit.get()); 5153f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 5154dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Make sure that the type we are copying is complete. 5155d10099e5c8238fa0327f03921cf2e3c8975c881eDouglas Gregor if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete)) 51563fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 5157f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 5158cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Perform overload resolution using the class's copy/move constructors. 515983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Only consider constructors and constructor templates. Per 516083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // C++0x [dcl.init]p16, second bullet to class types, this initialization 516183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // is direct-initialization. 51626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); 516383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith LookupCopyAndMoveConstructors(S, CandidateSet, Class, CurInitExpr); 5164dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 51657cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 51667cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 516718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 516825ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth switch (CandidateSet.BestViableFunction(S, Loc, Best)) { 516918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 517018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 5171dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 517218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 517357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin S.Diag(Loc, IsExtraneousCopy && !S.isSFINAEContext() 517457d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin ? diag::ext_rvalue_to_reference_temp_copy_no_viable 517557d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin : diag::err_temp_copy_no_viable) 51767abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 517718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 517813a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet.NoteCandidates(S, OCD_AllCandidates, CurInitExpr); 517957d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin if (!IsExtraneousCopy || S.isSFINAEContext()) 5180f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 51813fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 5182dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 518318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 518418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 51857abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 518618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 518713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet.NoteCandidates(S, OCD_ViableCandidates, CurInitExpr); 5188f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5189dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 519018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 519118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 51927abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 519318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 51946c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.NoteDeletedFunction(Best->Function); 5195f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 519618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 519718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 51983fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function); 51994e28d9e2ba9ce237549b45cfd4136ec6536d1325Benjamin Kramer SmallVector<Expr*, 8> ConstructorArgs; 5200c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit.get(); // Ownership transferred into MultiExprArg, below. 5201523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 52029a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 520357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin Best->FoundDecl.getAccess(), IsExtraneousCopy); 5204523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 5205523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (IsExtraneousCopy) { 5206523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // If this is a totally extraneous copy for C++03 reference 5207523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // binding purposes, just return the original initialization 52082559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // expression. We don't generate an (elided) copy operation here 52092559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // because doing so would require us to pass down a flag to avoid 52102559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // infinite recursion, where each step adds another extraneous, 52112559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // elidable copy. 52122559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 52132559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Instantiate the default arguments of any extra parameters in 52142559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // the selected copy constructor, as if we were going to create a 52152559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // proper call to the copy constructor. 52162559a7045a74679c80376305397a5953d038e1d0Douglas Gregor for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) { 52172559a7045a74679c80376305397a5953d038e1d0Douglas Gregor ParmVarDecl *Parm = Constructor->getParamDecl(I); 52182559a7045a74679c80376305397a5953d038e1d0Douglas Gregor if (S.RequireCompleteType(Loc, Parm->getType(), 5219d10099e5c8238fa0327f03921cf2e3c8975c881eDouglas Gregor diag::err_call_incomplete_argument)) 52202559a7045a74679c80376305397a5953d038e1d0Douglas Gregor break; 52212559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 52222559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Build the default argument expression; we don't actually care 52232559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if this succeeds or not, because this routine will complain 52242559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if there was a problem. 52252559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm); 52262559a7045a74679c80376305397a5953d038e1d0Douglas Gregor } 5227523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 5228c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return CurInitExpr; 5229523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor } 5230dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 52313fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine the arguments required to actually perform the 5232523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // constructor call (we might have derived-to-base conversions, or 5233523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // the copy constructor may have default arguments). 52341f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko if (S.CompleteConstructorCall(Constructor, CurInitExpr, Loc, ConstructorArgs)) 5235f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 52363fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 5237b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // Actually perform the constructor call. 5238b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, T, Constructor, Elidable, 52393fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ConstructorArgs, 52407cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 5241c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith /*ListInit*/ false, 5242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*StdInitListInit*/ false, 52437a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 5244428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 5245428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 5246dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5247b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // If we're supposed to bind temporaries, do so. 5248b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity)) 5249c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>()); 52503fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 525118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 525220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 525383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Check whether elidable copy construction for binding a reference to 525483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// a temporary would have succeeded if we were building in C++98 mode, for 525583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// -Wc++98-compat. 525683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void CheckCXX98CompatAccessibleCopy(Sema &S, 525783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const InitializedEntity &Entity, 525883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr) { 525980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith assert(S.getLangOpts().CPlusPlus11); 526083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 526183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>(); 526283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Record) 526383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return; 526483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 526583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr); 5266c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (S.Diags.isIgnored(diag::warn_cxx98_compat_temp_copy, Loc)) 526783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return; 526883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 526983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Find constructors which would have been considered. 52706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); 527183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith LookupCopyAndMoveConstructors( 527283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S, CandidateSet, cast<CXXRecordDecl>(Record->getDecl()), CurInitExpr); 527383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 527483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Perform overload resolution. 527583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet::iterator Best; 527683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadingResult OR = CandidateSet.BestViableFunction(S, Loc, Best); 527783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 527883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy) 527983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << OR << (int)Entity.getKind() << CurInitExpr->getType() 528083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << CurInitExpr->getSourceRange(); 528183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 528283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith switch (OR) { 528383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Success: 528483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function), 5285b9abd87283ac6e929b7e12a577663bc99e61d020John McCall Entity, Best->FoundDecl.getAccess(), Diag); 528683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // FIXME: Check default arguments as far as that's possible. 528783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 528883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 528983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_No_Viable_Function: 529083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 529113a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet.NoteCandidates(S, OCD_AllCandidates, CurInitExpr); 529283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 529383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 529483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Ambiguous: 529583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 529613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet.NoteCandidates(S, OCD_ViableCandidates, CurInitExpr); 529783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 529883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 529983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Deleted: 530083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 53016c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.NoteDeletedFunction(Best->Function); 530283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 530383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 530483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 530583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 5306a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregorvoid InitializationSequence::PrintInitLocationNote(Sema &S, 5307a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor const InitializedEntity &Entity) { 53082651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian if (Entity.isParameterKind() && Entity.getDecl()) { 5309a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getLocation().isInvalid()) 5310a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor return; 5311a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 5312a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getDeclName()) 5313a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here) 5314a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor << Entity.getDecl()->getDeclName(); 5315a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor else 5316a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here); 5317a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } 5318f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian else if (Entity.getKind() == InitializedEntity::EK_RelatedResult && 5319f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian Entity.getMethodDecl()) 5320f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian S.Diag(Entity.getMethodDecl()->getLocation(), 5321f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian diag::note_method_return_type_change) 5322f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian << Entity.getMethodDecl()->getDeclName(); 5323a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor} 5324a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 53253b80232b50c29b245e674f5aa02047b408e41018Sebastian Redlstatic bool isReferenceBinding(const InitializationSequence::Step &s) { 53263b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return s.Kind == InitializationSequence::SK_BindReference || 53273b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl s.Kind == InitializationSequence::SK_BindReferenceToTemporary; 53283b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl} 53293b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl 53302624b8157660902303bfce5551cfdd38272d01e5Jordan Rose/// Returns true if the parameters describe a constructor initialization of 53312624b8157660902303bfce5551cfdd38272d01e5Jordan Rose/// an explicit temporary object, e.g. "Point(x, y)". 53322624b8157660902303bfce5551cfdd38272d01e5Jordan Rosestatic bool isExplicitTemporary(const InitializedEntity &Entity, 53332624b8157660902303bfce5551cfdd38272d01e5Jordan Rose const InitializationKind &Kind, 53342624b8157660902303bfce5551cfdd38272d01e5Jordan Rose unsigned NumArgs) { 53352624b8157660902303bfce5551cfdd38272d01e5Jordan Rose switch (Entity.getKind()) { 53362624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializedEntity::EK_Temporary: 53372624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializedEntity::EK_CompoundLiteralInit: 5338f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case InitializedEntity::EK_RelatedResult: 53392624b8157660902303bfce5551cfdd38272d01e5Jordan Rose break; 53402624b8157660902303bfce5551cfdd38272d01e5Jordan Rose default: 53412624b8157660902303bfce5551cfdd38272d01e5Jordan Rose return false; 53422624b8157660902303bfce5551cfdd38272d01e5Jordan Rose } 53432624b8157660902303bfce5551cfdd38272d01e5Jordan Rose 53442624b8157660902303bfce5551cfdd38272d01e5Jordan Rose switch (Kind.getKind()) { 53452624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializationKind::IK_DirectList: 53462624b8157660902303bfce5551cfdd38272d01e5Jordan Rose return true; 53472624b8157660902303bfce5551cfdd38272d01e5Jordan Rose // FIXME: Hack to work around cast weirdness. 53482624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializationKind::IK_Direct: 53492624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializationKind::IK_Value: 53502624b8157660902303bfce5551cfdd38272d01e5Jordan Rose return NumArgs != 1; 53512624b8157660902303bfce5551cfdd38272d01e5Jordan Rose default: 53522624b8157660902303bfce5551cfdd38272d01e5Jordan Rose return false; 53532624b8157660902303bfce5551cfdd38272d01e5Jordan Rose } 53542624b8157660902303bfce5551cfdd38272d01e5Jordan Rose} 53552624b8157660902303bfce5551cfdd38272d01e5Jordan Rose 535610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstatic ExprResult 535710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian RedlPerformConstructorInitialization(Sema &S, 535810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializedEntity &Entity, 535910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationKind &Kind, 536010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl MultiExprArg Args, 536110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationSequence::Step& Step, 5362c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith bool &ConstructorInitRequiresZeroInit, 53631245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella bool IsListInitialization, 5364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool IsStdInitListInitialization, 53651245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceLocation LBraceLoc, 53661245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceLocation RBraceLoc) { 536710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl unsigned NumArgs = Args.size(); 536810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructorDecl *Constructor 536910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl = cast<CXXConstructorDecl>(Step.Function.Function); 537010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates = Step.Function.HadMultipleCandidates; 537110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 537210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Build a call to the selected constructor. 53734e28d9e2ba9ce237549b45cfd4136ec6536d1325Benjamin Kramer SmallVector<Expr*, 8> ConstructorArgs; 537410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid()) 537510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ? Kind.getEqualLoc() 537610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl : Kind.getLocation(); 537710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 537810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Kind.getKind() == InitializationKind::IK_Default) { 537910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Force even a trivial, implicit default constructor to be 538010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // semantically checked. We do this explicitly because we don't build 538110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // the definition for completely trivial constructors. 538228e4702a1f978213ff945fe4369e3be7444bf320Matt Beaumont-Gay assert(Constructor->getParent() && "No parent class for constructor."); 538310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() && 53845d86f61b9c54429fc3f9149fc0f7009010a644a1Douglas Gregor Constructor->isTrivial() && !Constructor->isUsed(false)) 538510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.DefineImplicitDefaultConstructor(Loc, Constructor); 538610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 538710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 5388c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprResult CurInit((Expr *)nullptr); 538910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 5390ed878af7914df535b32d64f555fa118413186672Douglas Gregor // C++ [over.match.copy]p1: 5391ed878af7914df535b32d64f555fa118413186672Douglas Gregor // - When initializing a temporary to be bound to the first parameter 5392ed878af7914df535b32d64f555fa118413186672Douglas Gregor // of a constructor that takes a reference to possibly cv-qualified 5393ed878af7914df535b32d64f555fa118413186672Douglas Gregor // T as its first argument, called with a single argument in the 5394ed878af7914df535b32d64f555fa118413186672Douglas Gregor // context of direct-initialization, explicit conversion functions 5395ed878af7914df535b32d64f555fa118413186672Douglas Gregor // are also considered. 5396ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowExplicitConv = Kind.AllowExplicit() && !Kind.isCopyInit() && 5397ed878af7914df535b32d64f555fa118413186672Douglas Gregor Args.size() == 1 && 5398ed878af7914df535b32d64f555fa118413186672Douglas Gregor Constructor->isCopyOrMoveConstructor(); 5399ed878af7914df535b32d64f555fa118413186672Douglas Gregor 540010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Determine the arguments required to actually perform the constructor 540110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // call. 54023fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer if (S.CompleteConstructorCall(Constructor, Args, 5403ed878af7914df535b32d64f555fa118413186672Douglas Gregor Loc, ConstructorArgs, 5404a4dc51b46861eb52626f89183da7610437baba93Richard Smith AllowExplicitConv, 5405a4dc51b46861eb52626f89183da7610437baba93Richard Smith IsListInitialization)) 540610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return ExprError(); 540710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 540810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 54092624b8157660902303bfce5551cfdd38272d01e5Jordan Rose if (isExplicitTemporary(Entity, Kind, NumArgs)) { 541010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // An explicitly-constructed temporary, e.g., X(1, 2). 54115f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(Loc, Constructor); 541282f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith if (S.DiagnoseUseOfDecl(Constructor, Loc)) 541382f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith return ExprError(); 541410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 541510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 541610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (!TSInfo) 541710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc); 54181245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange = 54191245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella (Kind.getKind() == InitializationKind::IK_DirectList) 54201245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella ? SourceRange(LBraceLoc, RBraceLoc) 54211245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella : Kind.getParenRange(); 542210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 5423c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = new (S.Context) CXXTemporaryObjectExpr( 5424c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines S.Context, Constructor, TSInfo, ConstructorArgs, ParenOrBraceRange, 5425c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines HadMultipleCandidates, IsListInitialization, 5426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines IsStdInitListInitialization, ConstructorInitRequiresZeroInit); 542710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } else { 542810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::ConstructionKind ConstructKind = 542910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_Complete; 543010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 543110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Entity.getKind() == InitializedEntity::EK_Base) { 543210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind = Entity.getBaseSpecifier()->isVirtual() ? 543310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_VirtualBase : 543410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_NonVirtualBase; 543510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } else if (Entity.getKind() == InitializedEntity::EK_Delegating) { 543610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind = CXXConstructExpr::CK_Delegating; 543710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 543810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 5439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Only get the parenthesis or brace range if it is a list initialization or 5440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // direct construction. 5441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceRange ParenOrBraceRange; 5442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (IsListInitialization) 5443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParenOrBraceRange = SourceRange(LBraceLoc, RBraceLoc); 5444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (Kind.getKind() == InitializationKind::IK_Direct) 5445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParenOrBraceRange = Kind.getParenRange(); 544610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 544710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // If the entity allows NRVO, mark the construction as elidable 544810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // unconditionally. 544910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Entity.allowsNRVO()) 545010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 545110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Constructor, /*Elidable=*/true, 54523fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ConstructorArgs, 545310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl HadMultipleCandidates, 5454c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith IsListInitialization, 5455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines IsStdInitListInitialization, 545610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit, 545710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind, 5458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParenOrBraceRange); 545910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl else 546010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 546110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Constructor, 54623fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ConstructorArgs, 546310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl HadMultipleCandidates, 5464c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith IsListInitialization, 5465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines IsStdInitListInitialization, 546610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit, 546710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind, 5468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParenOrBraceRange); 546910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 547010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (CurInit.isInvalid()) 547110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return ExprError(); 547210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 547310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Only check access if all of that succeeded. 547410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.CheckConstructorAccess(Loc, Constructor, Entity, 547510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Step.Function.FoundDecl.getAccess()); 547682f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc)) 547782f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith return ExprError(); 547810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 547910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (shouldBindAsTemporary(Entity)) 5480c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = S.MaybeBindToTemporary(CurInit.get()); 548110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 54823fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 548310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 548410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 548536d02af300a207242f0486b4255420d8be796b21Richard Smith/// Determine whether the specified InitializedEntity definitely has a lifetime 548636d02af300a207242f0486b4255420d8be796b21Richard Smith/// longer than the current full-expression. Conservatively returns false if 548736d02af300a207242f0486b4255420d8be796b21Richard Smith/// it's unclear. 548836d02af300a207242f0486b4255420d8be796b21Richard Smithstatic bool 548936d02af300a207242f0486b4255420d8be796b21Richard SmithInitializedEntityOutlivesFullExpression(const InitializedEntity &Entity) { 549036d02af300a207242f0486b4255420d8be796b21Richard Smith const InitializedEntity *Top = &Entity; 549136d02af300a207242f0486b4255420d8be796b21Richard Smith while (Top->getParent()) 549236d02af300a207242f0486b4255420d8be796b21Richard Smith Top = Top->getParent(); 549336d02af300a207242f0486b4255420d8be796b21Richard Smith 549436d02af300a207242f0486b4255420d8be796b21Richard Smith switch (Top->getKind()) { 549536d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Variable: 549636d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Result: 549736d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Exception: 549836d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Member: 549936d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_New: 550036d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Base: 550136d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Delegating: 550236d02af300a207242f0486b4255420d8be796b21Richard Smith return true; 550336d02af300a207242f0486b4255420d8be796b21Richard Smith 550436d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_ArrayElement: 550536d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_VectorElement: 550636d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_BlockElement: 550736d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_ComplexElement: 550836d02af300a207242f0486b4255420d8be796b21Richard Smith // Could not determine what the full initialization is. Assume it might not 550936d02af300a207242f0486b4255420d8be796b21Richard Smith // outlive the full-expression. 551036d02af300a207242f0486b4255420d8be796b21Richard Smith return false; 551136d02af300a207242f0486b4255420d8be796b21Richard Smith 551236d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Parameter: 55132651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case InitializedEntity::EK_Parameter_CF_Audited: 551436d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Temporary: 551536d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_LambdaCapture: 55162624b8157660902303bfce5551cfdd38272d01e5Jordan Rose case InitializedEntity::EK_CompoundLiteralInit: 5517f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case InitializedEntity::EK_RelatedResult: 551836d02af300a207242f0486b4255420d8be796b21Richard Smith // The entity being initialized might not outlive the full-expression. 551936d02af300a207242f0486b4255420d8be796b21Richard Smith return false; 552036d02af300a207242f0486b4255420d8be796b21Richard Smith } 552136d02af300a207242f0486b4255420d8be796b21Richard Smith 552236d02af300a207242f0486b4255420d8be796b21Richard Smith llvm_unreachable("unknown entity kind"); 552336d02af300a207242f0486b4255420d8be796b21Richard Smith} 552436d02af300a207242f0486b4255420d8be796b21Richard Smith 5525211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// Determine the declaration which an initialized entity ultimately refers to, 5526211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// for the purpose of lifetime-extending a temporary bound to a reference in 5527211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// the initialization of \p Entity. 55286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic const InitializedEntity *getEntityForTemporaryLifetimeExtension( 55296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const InitializedEntity *Entity, 55306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const InitializedEntity *FallbackDecl = nullptr) { 5531211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // C++11 [class.temporary]p5: 55326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines switch (Entity->getKind()) { 5533211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_Variable: 5534211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // The temporary [...] persists for the lifetime of the reference 55356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Entity; 5536211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5537211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_Member: 5538211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // For subobjects, we look at the complete object. 55396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Entity->getParent()) 55406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getEntityForTemporaryLifetimeExtension(Entity->getParent(), 55416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Entity); 5542211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5543211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // except: 5544211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // -- A temporary bound to a reference member in a constructor's 5545211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // ctor-initializer persists until the constructor exits. 55466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Entity; 5547211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5548211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_Parameter: 55492651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian case InitializedEntity::EK_Parameter_CF_Audited: 5550211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // -- A temporary bound to a reference parameter in a function call 5551211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // persists until the completion of the full-expression containing 5552211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // the call. 5553211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_Result: 5554211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // -- The lifetime of a temporary bound to the returned value in a 5555211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // function return statement is not extended; the temporary is 5556211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // destroyed at the end of the full-expression in the return statement. 5557211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_New: 5558211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // -- A temporary bound to a reference in a new-initializer persists 5559211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // until the completion of the full-expression containing the 5560211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // new-initializer. 55616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5562211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5563211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_Temporary: 5564211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_CompoundLiteralInit: 5565f92a509d870f05a0e26babd8072171957770649eFariborz Jahanian case InitializedEntity::EK_RelatedResult: 5566211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // We don't yet know the storage duration of the surrounding temporary. 5567211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // Assume it's got full-expression duration for now, it will patch up our 5568211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // storage duration if that's not correct. 55696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5570211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5571211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_ArrayElement: 5572211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // For subobjects, we look at the complete object. 55736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getEntityForTemporaryLifetimeExtension(Entity->getParent(), 55746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FallbackDecl); 5575211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5576211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_Base: 5577211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_Delegating: 5578211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // We can reach this case for aggregate initialization in a constructor: 5579211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // struct A { int &&r; }; 5580211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // struct B : A { B() : A{0} {} }; 5581211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // In this case, use the innermost field decl as the context. 5582211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return FallbackDecl; 5583211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5584211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_BlockElement: 5585211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_LambdaCapture: 5586211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_Exception: 5587211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_VectorElement: 5588211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case InitializedEntity::EK_ComplexElement: 55896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5590211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 55916f773e87eeb2ca04f86b1dcb98683887dfbe1ffaBenjamin Kramer llvm_unreachable("unknown entity kind"); 5592211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 5593211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 55946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic void performLifetimeExtension(Expr *Init, 55956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const InitializedEntity *ExtendingEntity); 5596211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5597211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// Update a glvalue expression that is used as the initializer of a reference 5598211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// to note that its lifetime is extended. 5599d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith/// \return \c true if any temporary had its lifetime extended. 56006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic bool 56016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesperformReferenceExtension(Expr *Init, 56026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const InitializedEntity *ExtendingEntity) { 5603d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // Walk past any constructs which we can lifetime-extend across. 5604d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith Expr *Old; 5605d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith do { 5606d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith Old = Init; 5607d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith 56080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) { 56090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (ILE->getNumInits() == 1 && ILE->isGLValue()) { 56100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // This is just redundant braces around an initializer. Step over it. 56110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Init = ILE->getInit(0); 56120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 56130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 56140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 5615d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // Step over any subobject adjustments; we may have a materialized 5616d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // temporary inside them. 5617d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith SmallVector<const Expr *, 2> CommaLHSs; 5618d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith SmallVector<SubobjectAdjustment, 2> Adjustments; 5619d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith Init = const_cast<Expr *>( 5620d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith Init->skipRValueSubobjectAdjustments(CommaLHSs, Adjustments)); 5621d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith 5622d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // Per current approach for DR1376, look through casts to reference type 5623d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // when performing lifetime extension. 5624d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith if (CastExpr *CE = dyn_cast<CastExpr>(Init)) 5625d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith if (CE->getSubExpr()->isGLValue()) 5626d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith Init = CE->getSubExpr(); 5627d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith 5628d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // FIXME: Per DR1213, subscripting on an array temporary produces an xvalue. 5629d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // It's unclear if binding a reference to that xvalue extends the array 5630d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // temporary. 5631d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith } while (Init != Old); 5632d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith 5633211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (MaterializeTemporaryExpr *ME = dyn_cast<MaterializeTemporaryExpr>(Init)) { 5634211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // Update the storage duration of the materialized temporary. 5635211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // FIXME: Rebuild the expression instead of mutating it. 56366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ME->setExtendingDecl(ExtendingEntity->getDecl(), 56376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ExtendingEntity->allocateManglingNumber()); 56386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines performLifetimeExtension(ME->GetTemporaryExpr(), ExtendingEntity); 5639d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith return true; 5640211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 5641d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith 5642d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith return false; 5643211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 5644211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5645211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// Update a prvalue expression that is going to be materialized as a 5646211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// lifetime-extended temporary. 56476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic void performLifetimeExtension(Expr *Init, 56486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const InitializedEntity *ExtendingEntity) { 5649211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // Dig out the expression which constructs the extended temporary. 5650211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith SmallVector<const Expr *, 2> CommaLHSs; 5651211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith SmallVector<SubobjectAdjustment, 2> Adjustments; 5652211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith Init = const_cast<Expr *>( 5653211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith Init->skipRValueSubobjectAdjustments(CommaLHSs, Adjustments)); 5654211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 56558a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith if (CXXBindTemporaryExpr *BTE = dyn_cast<CXXBindTemporaryExpr>(Init)) 56568a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith Init = BTE->getSubExpr(); 56578a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 56587c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (CXXStdInitializerListExpr *ILE = 5659d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith dyn_cast<CXXStdInitializerListExpr>(Init)) { 56606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines performReferenceExtension(ILE->getSubExpr(), ExtendingEntity); 5661d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith return; 5662d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith } 56637c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5664211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) { 56657c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (ILE->getType()->isArrayType()) { 5666211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith for (unsigned I = 0, N = ILE->getNumInits(); I != N; ++I) 56676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines performLifetimeExtension(ILE->getInit(I), ExtendingEntity); 5668211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return; 5669211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 5670211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 56717c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (CXXRecordDecl *RD = ILE->getType()->getAsCXXRecordDecl()) { 5672211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith assert(RD->isAggregate() && "aggregate init on non-aggregate"); 5673211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 5674211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // If we lifetime-extend a braced initializer which is initializing an 5675211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // aggregate, and that aggregate contains reference members which are 5676211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // bound to temporaries, those temporaries are also lifetime-extended. 5677211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (RD->isUnion() && ILE->getInitializedFieldInUnion() && 5678211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith ILE->getInitializedFieldInUnion()->getType()->isReferenceType()) 56796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines performReferenceExtension(ILE->getInit(0), ExtendingEntity); 5680211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith else { 5681211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith unsigned Index = 0; 5682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *I : RD->fields()) { 56833c3af140263c3761665aa2c0aac4266115f5caf1Richard Smith if (Index >= ILE->getNumInits()) 56843c3af140263c3761665aa2c0aac4266115f5caf1Richard Smith break; 5685211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (I->isUnnamedBitfield()) 5686211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith continue; 56875771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith Expr *SubInit = ILE->getInit(Index); 5688211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (I->getType()->isReferenceType()) 56896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines performReferenceExtension(SubInit, ExtendingEntity); 56905771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith else if (isa<InitListExpr>(SubInit) || 56915771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith isa<CXXStdInitializerListExpr>(SubInit)) 5692211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // This may be either aggregate-initialization of a member or 5693211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // initialization of a std::initializer_list object. Either way, 5694211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // we should recursively lifetime-extend that initializer. 56956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines performLifetimeExtension(SubInit, ExtendingEntity); 5696211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith ++Index; 5697211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 5698211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 5699211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 5700211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 5701211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 5702211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 57037c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithstatic void warnOnLifetimeExtension(Sema &S, const InitializedEntity &Entity, 57047c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith const Expr *Init, bool IsInitializerList, 57057c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith const ValueDecl *ExtendingDecl) { 57067c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Warn if a field lifetime-extends a temporary. 57077c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (isa<FieldDecl>(ExtendingDecl)) { 57087c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (IsInitializerList) { 57097c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith S.Diag(Init->getExprLoc(), diag::warn_dangling_std_initializer_list) 57107c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith << /*at end of constructor*/true; 57117c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return; 57127c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 57137c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 57147c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith bool IsSubobjectMember = false; 57157c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith for (const InitializedEntity *Ent = Entity.getParent(); Ent; 57167c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Ent = Ent->getParent()) { 57177c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (Ent->getKind() != InitializedEntity::EK_Base) { 57187c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith IsSubobjectMember = true; 57197c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith break; 57207c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 57217c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 57227c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith S.Diag(Init->getExprLoc(), 57237c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith diag::warn_bind_ref_member_to_temporary) 57247c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith << ExtendingDecl << Init->getSourceRange() 57257c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith << IsSubobjectMember << IsInitializerList; 57267c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (IsSubobjectMember) 57277c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith S.Diag(ExtendingDecl->getLocation(), 57287c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith diag::note_ref_subobject_of_member_declared_here); 57297c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith else 57307c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith S.Diag(ExtendingDecl->getLocation(), 57317c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith diag::note_ref_or_ptr_member_declared_here) 57327c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith << /*is pointer*/false; 57337c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 57347c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith} 57357c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 573613b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smithstatic void DiagnoseNarrowingInInitList(Sema &S, 573713b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith const ImplicitConversionSequence &ICS, 573813b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith QualType PreNarrowingType, 573913b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith QualType EntityType, 574013b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith const Expr *PostInit); 574113b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith 5742dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 574320093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 574420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 574520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 5746f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg Args, 5747d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 5748d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (Failed()) { 57491f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Diagnose(S, Entity, Kind, Args); 5750f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 575120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5752dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 57537491c499e826682e128a400038361ebcbde30eecSebastian Redl if (getKind() == DependentSequence) { 5754d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 5755d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 5756d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 5757d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 5758d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 5759d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 5760d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 5761d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 5762d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 5763d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 5764d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 5765d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 5766d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 5767d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 5768d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 57693fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer if (isa<InitListExpr>((Expr *)Args[0])) { 5770d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 5771d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 5772d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 5773d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 5774d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 5775d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 577639e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie if (IncompleteArrayTypeLoc ArrayLoc = 577739e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie TL.getAs<IncompleteArrayTypeLoc>()) 577839e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie Brackets = ArrayLoc.getBracketsRange(); 5779d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 5780d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 5781d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 5782d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 5783d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 57846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*NumElts=*/nullptr, 5785d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 5786d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 5787d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 5788d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 5789d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 5790d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 5791d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 57925b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (Kind.getKind() == InitializationKind::IK_Direct && 57935b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl !Kind.isExplicitCast()) { 57945b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // Rebuild the ParenListExpr. 57955b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl SourceRange ParenRange = Kind.getParenRange(); 57965b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(), 57973fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Args); 57985b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl } 57990d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek assert(Kind.getKind() == InitializationKind::IK_Copy || 5800a9b55a499a8b5ae0c4b373f751ef62af74ec494eDouglas Gregor Kind.isExplicitCast() || 5801a9b55a499a8b5ae0c4b373f751ef62af74ec494eDouglas Gregor Kind.getKind() == InitializationKind::IK_DirectList); 58023fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return ExprResult(Args[0]); 580320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 580420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 58057491c499e826682e128a400038361ebcbde30eecSebastian Redl // No steps means no initialization. 58067491c499e826682e128a400038361ebcbde30eecSebastian Redl if (Steps.empty()) 5807c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return ExprResult((Expr *)nullptr); 5808dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 580980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() && 58103fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Args.size() == 1 && isa<InitListExpr>(Args[0]) && 58112651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian !Entity.isParameterKind()) { 581203544fccd1782418c1bf2528111683e18f43b913Richard Smith // Produce a C++98 compatibility warning if we are initializing a reference 581303544fccd1782418c1bf2528111683e18f43b913Richard Smith // from an initializer list. For parameters, we produce a better warning 581403544fccd1782418c1bf2528111683e18f43b913Richard Smith // elsewhere. 58153fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Expr *Init = Args[0]; 581603544fccd1782418c1bf2528111683e18f43b913Richard Smith S.Diag(Init->getLocStart(), diag::warn_cxx98_compat_reference_list_init) 581703544fccd1782418c1bf2528111683e18f43b913Richard Smith << Init->getSourceRange(); 581836d02af300a207242f0486b4255420d8be796b21Richard Smith } 581936d02af300a207242f0486b4255420d8be796b21Richard Smith 582036d02af300a207242f0486b4255420d8be796b21Richard Smith // Diagnose cases where we initialize a pointer to an array temporary, and the 582136d02af300a207242f0486b4255420d8be796b21Richard Smith // pointer obviously outlives the temporary. 58223fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer if (Args.size() == 1 && Args[0]->getType()->isArrayType() && 582336d02af300a207242f0486b4255420d8be796b21Richard Smith Entity.getType()->isPointerType() && 582436d02af300a207242f0486b4255420d8be796b21Richard Smith InitializedEntityOutlivesFullExpression(Entity)) { 58253fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Expr *Init = Args[0]; 582636d02af300a207242f0486b4255420d8be796b21Richard Smith Expr::LValueClassification Kind = Init->ClassifyLValue(S.Context); 582736d02af300a207242f0486b4255420d8be796b21Richard Smith if (Kind == Expr::LV_ClassTemporary || Kind == Expr::LV_ArrayTemporary) 582836d02af300a207242f0486b4255420d8be796b21Richard Smith S.Diag(Init->getLocStart(), diag::warn_temporary_array_to_pointer_decay) 582936d02af300a207242f0486b4255420d8be796b21Richard Smith << Init->getSourceRange(); 583003544fccd1782418c1bf2528111683e18f43b913Richard Smith } 583103544fccd1782418c1bf2528111683e18f43b913Richard Smith 5832d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 5833d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 5834a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 5835a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 5836d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 5837a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 5838d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 583920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 5840c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprResult CurInit((Expr *)nullptr); 5841dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5842dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // For initialization steps that start with a single initializer, 584399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 584499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 584599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 584618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 584718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 5848906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 584918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 585018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 585118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 5852523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 585318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 585418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 5855906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 585618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 5857176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_AtomicConversion: 58581fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose case SK_LValueToRValue: 585918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 586013b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith case SK_ConversionSequenceNoNarrowing: 586118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 586213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 586313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 586418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 5865cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 5866cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ObjCObjectConversion: 5867f85e193739c953358c865005855253af4f68a497John McCall case SK_ArrayInit: 58680f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith case SK_ParenthesizedArrayInit: 5869f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 5870f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 58712b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_ProduceObjCObject: 5872e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_StdInitializerList: 587321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case SK_OCLSamplerInit: 5874e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_OCLZeroEvent: { 587518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 58763fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = Args[0]; 5877429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (!CurInit.get()) return ExprError(); 587818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 5879f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 5880dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 588118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 5882176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_ConstructorInitializationFromList: 5883176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_StdInitializerListConstructorCall: 588418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 588518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 588620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5887dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5888dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Walk through the computed steps for the initialization sequence, 588920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 589016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 589120093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 589220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 589320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 5894f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5895dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5896429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType(); 5897dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 589820093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 589920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 5900dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Overload resolution determined which function invoke; update the 590120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 5902429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl); 590382f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith if (S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation())) 590482f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith return ExprError(); 59053fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = S.FixOverloadedFunctionReference(CurInit, 59066bb8017bb9e828d118e15e59d71c66bba323c364John McCall Step->Function.FoundDecl, 59079aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.Function); 590820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5909dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 591020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 5911906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 591220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 591320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 591420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 5915dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5916f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 59175cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 591820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 591920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 592020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 5921429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getLocStart(), 5922429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getSourceRange(), 59235cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson &BasePath, IgnoreBaseAccess)) 5924f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5925dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 59265baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 5927906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_CastDerivedToBaseLValue ? 59285baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 5929906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_CastDerivedToBaseXValue ? 59305baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 59315baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 5932c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = 5933c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ImplicitCastExpr::Create(S.Context, Step->Type, CK_DerivedToBase, 5934c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit.get(), &BasePath, VK); 593520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 593620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5937dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 593820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 5939993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall // References cannot bind to bit-fields (C++ [dcl.init.ref]p5). 5940993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall if (CurInit.get()->refersToBitField()) { 5941993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall // We don't necessarily have an unambiguous source bit-field. 5942993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall FieldDecl *BitField = CurInit.get()->getSourceBitField(); 594320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 5944d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 5945993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall << (BitField ? BitField->getDeclName() : DeclarationName()) 59466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << (BitField != nullptr) 5947429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 5948993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall if (BitField) 5949993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 5950993f43f24d7a45a5cd4678a3316b0852261fc5d4John McCall 5951f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 595220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5953a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 5954429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInit.get()->refersToVectorElement()) { 595541593e3b7da967b52bc3c7f488b8752dee63f38eJohn McCall // References cannot bind to vector elements. 5956093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 5957093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 5958429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 5959a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 5960f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5961093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 5962dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 596320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 596420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 596520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 5966429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 5967f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59683aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 5969d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // Even though we didn't materialize a temporary, the binding may still 5970d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // extend the lifetime of a temporary. This happens if we bind a reference 5971d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // to the result of a cast to reference type. 59726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (const InitializedEntity *ExtendingEntity = 59736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getEntityForTemporaryLifetimeExtension(&Entity)) 59746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (performReferenceExtension(CurInit.get(), ExtendingEntity)) 59756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines warnOnLifetimeExtension(S, Entity, CurInit.get(), 59766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*IsInitializerList=*/false, 59776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ExtendingEntity->getDecl()); 5978d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith 597920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 59803aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 5981211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith case SK_BindReferenceToTemporary: { 59821fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose // Make sure the "temporary" is actually an rvalue. 59831fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose assert(CurInit.get()->isRValue() && "not a temporary"); 59841fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 598520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 5986429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 5987f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 598820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 598903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // Materialize the temporary into memory. 59908a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith MaterializeTemporaryExpr *MTE = new (S.Context) MaterializeTemporaryExpr( 5991211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith Entity.getType().getNonReferenceType(), CurInit.get(), 59926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Entity.getType()->isLValueReferenceType()); 59936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 59946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Maybe lifetime-extend the temporary's subobjects to match the 59956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // entity's lifetime. 59966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (const InitializedEntity *ExtendingEntity = 59976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getEntityForTemporaryLifetimeExtension(&Entity)) 59986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (performReferenceExtension(MTE, ExtendingEntity)) 59996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines warnOnLifetimeExtension(S, Entity, CurInit.get(), /*IsInitializerList=*/false, 60006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ExtendingEntity->getDecl()); 6001d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 6002d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // If we're binding to an Objective-C object that has lifetime, we 60038a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // need cleanups. Likewise if we're extending this temporary to automatic 60048a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // storage duration -- we need to register its cleanup during the 60058a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // full-expression's cleanups. 60068a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith if ((S.getLangOpts().ObjCAutoRefCount && 60078a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith MTE->getType()->isObjCLifetimeType()) || 60088a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith (MTE->getStorageDuration() == SD_Automatic && 60098a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith MTE->getType().isDestructedType())) 6010d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor S.ExprNeedsCleanups = true; 60118a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6012c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = MTE; 601320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6014211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 6015dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6016523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 60173fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = CopyObject(S, Step->Type, Entity, CurInit, 6018523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor /*IsExtraneousCopy=*/true); 6019523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 6020523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 602120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 602220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 602320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 6024daa8e4e888758d55a7a759dd4a91b83921cef222John McCall CastKind CastKind; 602518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 60269aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionDecl *Fn = Step->Function.Function; 60279aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundFn = Step->Function.FoundDecl; 60287cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = Step->Function.HadMultipleCandidates; 60294154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor bool CreatedObject = false; 6030b13b737a2450167c82e148590e8019b839ce6b98John McCall if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) { 603120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 60324e28d9e2ba9ce237549b45cfd4136ec6536d1325Benjamin Kramer SmallVector<Expr*, 8> ConstructorArgs; 6033429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley SourceLocation Loc = CurInit.get()->getLocStart(); 6034c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit.get(); // Ownership transferred into MultiExprArg, below. 6035b13b737a2450167c82e148590e8019b839ce6b98John McCall 603620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 603720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 6038429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley Expr *Arg = CurInit.get(); 603920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 6040429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley MultiExprArg(&Arg, 1), 604120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 6042f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6043dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6044f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // Build an expression that constructs a temporary. 6045dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 60463fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ConstructorArgs, 60477cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 6048c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith /*ListInit*/ false, 6049176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*StdInitListInit*/ false, 60507a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 6051428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 6052428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 605320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 6054f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6055b13b737a2450167c82e148590e8019b839ce6b98John McCall 60569a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Kind.getLocation(), Constructor, Entity, 60579aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn.getAccess()); 605882f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation())) 605982f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith return ExprError(); 6060dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 60612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_ConstructorConversion; 606218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 606318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 606418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 606518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 6066dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 60674154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = true; 606820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 606920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 6070b13b737a2450167c82e148590e8019b839ce6b98John McCall CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn); 60716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), nullptr, 60729aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn); 607382f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation())) 607482f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith return ExprError(); 6075dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6076dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Should we move this initialization into a separate 607720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 607820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 6079429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 6080c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines S.PerformObjectArgumentInitialization(CurInit.get(), 60816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*Qualifier=*/nullptr, 6082429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley FoundFn, Conversion); 6083429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if(CurInitExprRes.isInvalid()) 6084f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60853fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = CurInitExprRes; 6086dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 608720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 60887cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion, 60897cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates); 609020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 6091f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6092dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 60932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_UserDefinedConversion; 6094dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6095651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CreatedObject = Conversion->getReturnType()->isRecordType(); 609620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 6097dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 60983b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl bool RequiresCopy = !IsCopy && !isReferenceBinding(Steps.back()); 6099960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara bool MaybeBindToTemp = RequiresCopy || shouldBindAsTemporary(Entity); 6100960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara 6101960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara if (!MaybeBindToTemp && CreatedObject && shouldDestroyTemporary(Entity)) { 6102429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType T = CurInit.get()->getType(); 61034154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) { 6104dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXDestructorDecl *Destructor 6105db89f289a22897f1031c92f3e49f7a9ba7bae61eDouglas Gregor = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl())); 6106429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckDestructorAccess(CurInit.get()->getLocStart(), Destructor, 61074154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.PDiag(diag::err_access_dtor_temp) << T); 61085f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(CurInit.get()->getLocStart(), Destructor); 610982f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith if (S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getLocStart())) 611082f145d4ed86d19cb2a1680cda53fdc39bb38eb6Richard Smith return ExprError(); 61114154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 61124154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 6113dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6114c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = ImplicitCastExpr::Create(S.Context, CurInit.get()->getType(), 6115c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CastKind, CurInit.get(), nullptr, 6116c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit.get()->getValueKind()); 6117960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara if (MaybeBindToTemp) 6118c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>()); 61192f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy) 6120523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity, 61213fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit, /*IsExtraneousCopy=*/false); 612220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 612320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 6124906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 612520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 6126906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 6127906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionRValue: { 612820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 61295baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 6130906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_QualificationConversionLValue ? 61315baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 6132906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_QualificationConversionXValue ? 61335baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 61345baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 6135c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type, CK_NoOp, VK); 613620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6137906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 6138906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 6139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_AtomicConversion: { 6140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(CurInit.get()->isRValue() && "cannot convert glvalue to atomic"); 6141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type, 6142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CK_NonAtomicToAtomic, VK_RValue); 6143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 6144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 6145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 61461fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose case SK_LValueToRValue: { 61471fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose assert(CurInit.get()->isGLValue() && "cannot load from a prvalue"); 6148c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = ImplicitCastExpr::Create(S.Context, Step->Type, 6149c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CK_LValueToRValue, CurInit.get(), 6150c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /*BasePath=*/nullptr, VK_RValue); 61511fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose break; 61521fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose } 61531fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 615413b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith case SK_ConversionSequence: 615513b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith case SK_ConversionSequenceNoNarrowing: { 615613b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith Sema::CheckedConversionKind CCK 6157f85e193739c953358c865005855253af4f68a497John McCall = Kind.isCStyleCast()? Sema::CCK_CStyleCast 6158f85e193739c953358c865005855253af4f68a497John McCall : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast 6159c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith : Kind.isExplicitCast()? Sema::CCK_OtherCast 6160f85e193739c953358c865005855253af4f68a497John McCall : Sema::CCK_ImplicitConversion; 6161429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 6162429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS, 6163f85e193739c953358c865005855253af4f68a497John McCall getAssignmentAction(Entity), CCK); 6164429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 6165f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61663fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = CurInitExprRes; 616713b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith 616813b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith if (Step->Kind == SK_ConversionSequenceNoNarrowing && 616913b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith S.getLangOpts().CPlusPlus && !CurInit.get()->isValueDependent()) 617013b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith DiagnoseNarrowingInInitList(S, *Step->ICS, SourceType, Entity.getType(), 617113b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith CurInit.get()); 617220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6173f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor } 6174dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6175d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 6176429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley InitListExpr *InitList = cast<InitListExpr>(CurInit.get()); 61777c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // If we're not initializing the top-level entity, we need to create an 61787c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // InitializeTemporary entity for our target type. 61797c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith QualType Ty = Step->Type; 61807c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith bool IsTemporary = !S.Context.hasSameType(Entity.getType(), Ty); 618113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(Ty); 6182802e22682c17c4a9df3f747abd224db38e382e39Richard Smith InitializedEntity InitEntity = IsTemporary ? TempEntity : Entity; 6183802e22682c17c4a9df3f747abd224db38e382e39Richard Smith InitListChecker PerformInitList(S, InitEntity, 618440cba90626044ff28b58c33e743366e94c898227Richard Smith InitList, Ty, /*VerifyOnly=*/false); 618514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (PerformInitList.HadError()) 6186f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6187d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 61887c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Hack: We must update *ResultType if available in order to set the 61897c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // bounds of arrays, e.g. in 'int ar[] = {1, 2, 3};'. 61907c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Worst case: 'const int (&arref)[] = {1, 2, 3};'. 61917c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (ResultType && 61927c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith ResultType->getNonReferenceType()->isIncompleteArrayType()) { 619313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if ((*ResultType)->isRValueReferenceType()) 619413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Ty = S.Context.getRValueReferenceType(Ty); 619513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl else if ((*ResultType)->isLValueReferenceType()) 619613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Ty = S.Context.getLValueReferenceType(Ty, 619713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl (*ResultType)->getAs<LValueReferenceType>()->isSpelledAsLValue()); 619813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl *ResultType = Ty; 619913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 620013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 620113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *StructuredInitList = 620213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl PerformInitList.getFullyStructuredList(); 6203c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit.get(); 6204802e22682c17c4a9df3f747abd224db38e382e39Richard Smith CurInit = shouldBindAsTemporary(InitEntity) 6205802e22682c17c4a9df3f747abd224db38e382e39Richard Smith ? S.MaybeBindToTemporary(StructuredInitList) 6206c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines : StructuredInitList; 6207d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 6208d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 620951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 6210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_ConstructorInitializationFromList: { 6211168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // When an initializer list is passed for a parameter of type "reference 6212168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // to object", we don't get an EK_Temporary entity, but instead an 6213168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // EK_Parameter entity with reference type. 6214bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // FIXME: This is a hack. What we really should do is create a user 6215bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // conversion step for this case, but this makes it considerably more 6216bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // complicated. For now, this will do. 6217168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary( 6218168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Entity.getType().getNonReferenceType()); 6219168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool UseTemporary = Entity.getType()->isReferenceType(); 6220f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith assert(Args.size() == 1 && "expected a single argument for list init"); 62213fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer InitListExpr *InitList = cast<InitListExpr>(Args[0]); 622203544fccd1782418c1bf2528111683e18f43b913Richard Smith S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init) 622303544fccd1782418c1bf2528111683e18f43b913Richard Smith << InitList->getSourceRange(); 622410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl MultiExprArg Arg(InitList->getInits(), InitList->getNumInits()); 6225168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity : 6226168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Entity, 62273fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Kind, Arg, *Step, 6228c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith ConstructorInitRequiresZeroInit, 6229176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*IsListInitialization*/true, 6230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*IsStdInitListInit*/false, 62311245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella InitList->getLBraceLoc(), 62321245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella InitList->getRBraceLoc()); 623310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl break; 623410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 62358713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 623613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 6237c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = cast<InitListExpr>(CurInit.get())->getInit(0); 623813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 623913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 624013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: { 6241c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Expr *E = CurInit.get(); 624213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *Syntactic = Step->WrappingSyntacticList; 624313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *ILE = new (S.Context) InitListExpr(S.Context, 62443b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer Syntactic->getLBraceLoc(), E, Syntactic->getRBraceLoc()); 624513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setSyntacticForm(Syntactic); 624613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setType(E->getType()); 624713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setValueKind(E->getValueKind()); 6248c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = ILE; 624913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 625013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 625113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 6252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_ConstructorInitialization: 6253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_StdInitializerListConstructorCall: { 6254bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // When an initializer list is passed for a parameter of type "reference 6255bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // to object", we don't get an EK_Temporary entity, but instead an 6256bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // EK_Parameter entity with reference type. 6257bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // FIXME: This is a hack. What we really should do is create a user 6258bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // conversion step for this case, but this makes it considerably more 6259bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // complicated. For now, this will do. 6260bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary( 6261bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl Entity.getType().getNonReferenceType()); 6262bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl bool UseTemporary = Entity.getType()->isReferenceType(); 6263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool IsStdInitListInit = 6264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Step->Kind == SK_StdInitializerListConstructorCall; 6265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CurInit = PerformConstructorInitialization( 6266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S, UseTemporary ? TempEntity : Entity, Kind, Args, *Step, 6267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ConstructorInitRequiresZeroInit, 6268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*IsListInitialization*/IsStdInitListInit, 6269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*IsStdInitListInitialization*/IsStdInitListInit, 6270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*LBraceLoc*/SourceLocation(), 6271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*RBraceLoc*/SourceLocation()); 627251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 6273bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl } 6274dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 627571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 627616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 627716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 6278dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (NextStep != StepEnd && 6279f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith (NextStep->Kind == SK_ConstructorInitialization || 6280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines NextStep->Kind == SK_ConstructorInitializationFromList)) { 628116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 628216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 628316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 628416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 62854e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie S.getLangOpts().CPlusPlus && 628616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 6287ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 6288ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 6289dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type, 6290ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Kind.getRange().getBegin()); 6291ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 6292c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = new (S.Context) CXXScalarValueInitExpr( 6293c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines TSInfo->getType().getNonLValueExprType(S.Context), TSInfo, 6294c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Kind.getRange().getEnd()); 629516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 6296c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = new (S.Context) ImplicitValueInitExpr(Step->Type); 629716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 629871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 629971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 630018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 630118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 6302429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get()->getType(); 63033fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ExprResult Result = CurInit; 630418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 630501ad048b70508bf21174cd25512b57f87b7c57a6Fariborz Jahanian S.CheckSingleAssignmentConstraints(Step->Type, Result, true, 630601ad048b70508bf21174cd25512b57f87b7c57a6Fariborz Jahanian Entity.getKind() == InitializedEntity::EK_Parameter_CF_Audited); 6307429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Result.isInvalid()) 6308429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 63093fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = Result; 6310aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 6311aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 63123fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ExprResult CurInitExprRes = CurInit; 6313aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 63142651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian Entity.isParameterKind() && 6315429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes) 6316aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 6317aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 6318429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 6319429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 63203fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = CurInitExprRes; 6321aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 6322a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor bool Complained; 632318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 632418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 6325429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get(), 63263d672e4aa51fcf231de5d5283b1ee3f6c6a79e8cFariborz Jahanian getAssignmentAction(Entity, true), 6327a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor &Complained)) { 6328a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 6329f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6330a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } else if (Complained) 6331a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 633218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 633318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 6334cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 6335cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 6336cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 6337429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CheckStringInit(CurInit.get(), ResultType ? *ResultType : Ty, 6338fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall S.Context.getAsArrayType(Ty), S); 6339cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 6340cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 6341569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 6342569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 6343c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type, 63442de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_ObjCObjectLValueCast, 6345c1c0dfb376b829b94d4c61e9f358ce23e6aa3169Eli Friedman CurInit.get()->getValueKind()); 6346569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 6347cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 6348cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 6349cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Okay: we checked everything before creating this step. Note that 6350cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // this is a GNU extension. 6351cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), diag::ext_array_init_copy) 6352429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << Step->Type << CurInit.get()->getType() 6353429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 6354cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 6355cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the destination type is an incomplete array type, update the 6356cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type accordingly. 6357cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (ResultType) { 6358cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const IncompleteArrayType *IncompleteDest 6359cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = S.Context.getAsIncompleteArrayType(Step->Type)) { 6360cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ConstantArrayType *ConstantSource 6361429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley = S.Context.getAsConstantArrayType(CurInit.get()->getType())) { 6362cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor *ResultType = S.Context.getConstantArrayType( 6363cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor IncompleteDest->getElementType(), 6364cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ConstantSource->getSize(), 6365cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ArrayType::Normal, 0); 6366cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 6367cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 6368cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 6369f85e193739c953358c865005855253af4f68a497John McCall break; 6370cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 63710f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith case SK_ParenthesizedArrayInit: 63720f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith // Okay: we checked everything before creating this step. Note that 63730f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith // this is a GNU extension. 63740f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith S.Diag(Kind.getLocation(), diag::ext_array_init_parens) 63750f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith << CurInit.get()->getSourceRange(); 63760f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith break; 63770f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith 6378f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 6379f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 6380f85e193739c953358c865005855253af4f68a497John McCall checkIndirectCopyRestoreSource(S, CurInit.get()); 6381c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = new (S.Context) ObjCIndirectCopyRestoreExpr( 6382c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit.get(), Step->Type, 6383c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Step->Kind == SK_PassByIndirectCopyRestore); 6384f85e193739c953358c865005855253af4f68a497John McCall break; 6385f85e193739c953358c865005855253af4f68a497John McCall 6386f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 6387c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = 6388c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ImplicitCastExpr::Create(S.Context, Step->Type, CK_ARCProduceObject, 6389c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit.get(), nullptr, VK_RValue); 6390cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 63912b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 63922b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: { 63937c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith S.Diag(CurInit.get()->getExprLoc(), 63947c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith diag::warn_cxx98_compat_initializer_list_init) 63957c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith << CurInit.get()->getSourceRange(); 63962835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 63977c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Materialize the temporary into memory. 63987c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith MaterializeTemporaryExpr *MTE = new (S.Context) 63997c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith MaterializeTemporaryExpr(CurInit.get()->getType(), CurInit.get(), 64006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*BoundToLvalueReference=*/false); 64016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 64026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Maybe lifetime-extend the array temporary's subobjects to match the 64036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // entity's lifetime. 64046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (const InitializedEntity *ExtendingEntity = 64056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getEntityForTemporaryLifetimeExtension(&Entity)) 64066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (performReferenceExtension(MTE, ExtendingEntity)) 64076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines warnOnLifetimeExtension(S, Entity, CurInit.get(), 64086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*IsInitializerList=*/true, 64096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ExtendingEntity->getDecl()); 64107c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 64117c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Wrap it in a construction of a std::initializer_list<T>. 6412c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = new (S.Context) CXXStdInitializerListExpr(Step->Type, MTE); 64137c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 64147c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Bind the result, in case the library has given initializer_list a 64157c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // non-trivial destructor. 64167c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith if (shouldBindAsTemporary(Entity)) 6417c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = S.MaybeBindToTemporary(CurInit.get()); 64182b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 64192b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 64207c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 642121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case SK_OCLSamplerInit: { 642221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei assert(Step->Type->isSamplerT() && 6423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "Sampler initialization on non-sampler type."); 642421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 642521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei QualType SourceType = CurInit.get()->getType(); 642621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 64272651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian if (Entity.isParameterKind()) { 642821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei if (!SourceType->isSamplerT()) 642921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei S.Diag(Kind.getLocation(), diag::err_sampler_argument_required) 643021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei << SourceType; 64312651b7a44d1db7c2a9fe70689e0708394c343a7eFariborz Jahanian } else if (Entity.getKind() != InitializedEntity::EK_Variable) { 643221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei llvm_unreachable("Invalid EntityKind!"); 643321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei } 643421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 643521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei break; 643621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei } 6437e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_OCLZeroEvent: { 6438e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei assert(Step->Type->isEventT() && 6439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "Event initialization on non-event type."); 6440e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 6441c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type, 6442e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei CK_ZeroToOCLEvent, 6443e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei CurInit.get()->getValueKind()); 6444e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei break; 6445e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei } 644620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 644720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 644815d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall 644915d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall // Diagnose non-fatal problems with the completed initialization. 645015d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall if (Entity.getKind() == InitializedEntity::EK_Member && 645115d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl())->isBitField()) 645215d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall S.CheckBitFieldInitialization(Kind.getLocation(), 645315d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl()), 645415d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall CurInit.get()); 6455dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 64563fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 645720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 645820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 6459d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith/// Somewhere within T there is an uninitialized reference subobject. 6460d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith/// Dig it out and diagnose it. 6461a574c8909748fc0d2fd723a48334d6d2c72c8227Benjamin Kramerstatic bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc, 6462a574c8909748fc0d2fd723a48334d6d2c72c8227Benjamin Kramer QualType T) { 6463d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (T->isReferenceType()) { 6464d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith S.Diag(Loc, diag::err_reference_without_init) 6465d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith << T.getNonReferenceType(); 6466d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return true; 6467d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 6468d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 6469d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); 6470d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (!RD || !RD->hasUninitializedReferenceMember()) 6471d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return false; 6472d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 6473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *FI : RD->fields()) { 6474d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (FI->isUnnamedBitfield()) 6475d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith continue; 6476d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 6477d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (DiagnoseUninitializedReference(S, FI->getLocation(), FI->getType())) { 6478d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith S.Diag(Loc, diag::note_value_initialization_here) << RD; 6479d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return true; 6480d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 6481d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 6482d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 6483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &BI : RD->bases()) { 6484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DiagnoseUninitializedReference(S, BI.getLocStart(), BI.getType())) { 6485d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith S.Diag(Loc, diag::note_value_initialization_here) << RD; 6486d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return true; 6487d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 6488d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 6489d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 6490d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return false; 6491d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith} 6492d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 6493d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 649420093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 649520093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 649620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 64977cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall 64987cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall/// Emit notes associated with an initialization that failed due to a 64997cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall/// "simple" conversion failure. 65007cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCallstatic void emitBadConversionNotes(Sema &S, const InitializedEntity &entity, 65017cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall Expr *op) { 65027cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall QualType destType = entity.getType(); 65037cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall if (destType.getNonReferenceType()->isObjCObjectPointerType() && 65047cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall op->getType()->isObjCObjectPointerType()) { 65057cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall 65067cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall // Emit a possible note about the conversion failing because the 65077cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall // operand is a message send with a related result type. 65087cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall S.EmitRelatedResultTypeNote(op); 65097cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall 65107cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall // Emit a possible note about a return failing because we're 65117cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall // expecting a related result type. 65127cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall if (entity.getKind() == InitializedEntity::EK_Result) 65137cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall S.EmitRelatedResultTypeNoteForReturn(destType); 65147cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall } 65157cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall} 65167cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall 65172ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendlingstatic void diagnoseListInit(Sema &S, const InitializedEntity &Entity, 65182ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling InitListExpr *InitList) { 65192ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling QualType DestType = Entity.getType(); 65202ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling 65212ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling QualType E; 65222ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling if (S.getLangOpts().CPlusPlus11 && S.isStdInitializerList(DestType, &E)) { 65232ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling QualType ArrayType = S.Context.getConstantArrayType( 65242ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling E.withConst(), 65252ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), 65262ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling InitList->getNumInits()), 65272ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling clang::ArrayType::Normal, 0); 65282ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling InitializedEntity HiddenArray = 65292ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling InitializedEntity::InitializeTemporary(ArrayType); 65302ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling return diagnoseListInit(S, HiddenArray, InitList); 65312ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling } 65322ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling 6533176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (DestType->isReferenceType()) { 6534176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // A list-initialization failure for a reference means that we tried to 6535176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // create a temporary of the inner type (per [dcl.init.list]p3.6) and the 6536176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // inner initialization failed. 6537176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType T = DestType->getAs<ReferenceType>()->getPointeeType(); 6538176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diagnoseListInit(S, InitializedEntity::InitializeTemporary(T), InitList); 6539176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation Loc = InitList->getLocStart(); 6540176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (auto *D = Entity.getDecl()) 6541176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Loc = D->getLocation(); 6542176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S.Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T; 6543176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 6544176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 6545176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 65462ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling InitListChecker DiagnoseInitList(S, Entity, InitList, DestType, 65472ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling /*VerifyOnly=*/false); 65482ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling assert(DiagnoseInitList.HadError() && 65492ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling "Inconsistent init list check result."); 65502ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling} 65512ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling 6552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// Prints a fixit for adding a null initializer for |Entity|. Call this only 6553176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// right after emitting a diagnostic. 6554176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic void maybeEmitZeroInitializationFixit(Sema &S, 6555176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines InitializationSequence &Sequence, 6556176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const InitializedEntity &Entity) { 6557176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Entity.getKind() != InitializedEntity::EK_Variable) 6558176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 6559176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 6560176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines VarDecl *VD = cast<VarDecl>(Entity.getDecl()); 6561176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (VD->getInit() || VD->getLocEnd().isMacroID()) 6562176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 6563176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 6564176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType VariableTy = VD->getType().getCanonicalType(); 6565176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation Loc = S.getLocForEndOfToken(VD->getLocEnd()); 6566176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc); 6567176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 6568176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S.Diag(Loc, diag::note_add_initializer) 6569176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << VD << FixItHint::CreateInsertion(Loc, Init); 6570176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 6571176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 6572dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumibool InitializationSequence::Diagnose(Sema &S, 657320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 657420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 65751f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko ArrayRef<Expr *> Args) { 6576d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 657720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 6578dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6579d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 658020093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 658120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 65829db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 65831f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko if (Args.empty()) { 6584d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // Dig out the reference subobject which is uninitialized and diagnose it. 6585d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // If this is value-initialization, this could be nested some way within 6586d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // the target type. 6587d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith assert(Kind.getKind() == InitializationKind::IK_Value || 6588d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith DestType->isReferenceType()); 6589d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith bool Diagnosed = 6590d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith DiagnoseUninitializedReference(S, Kind.getLocation(), DestType); 6591d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith assert(Diagnosed && "couldn't find uninitialized reference to diagnose"); 6592d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith (void)Diagnosed; 6593d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } else // FIXME: diagnostic below could be better! 65949db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 65951f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko << SourceRange(Args.front()->getLocStart(), Args.back()->getLocEnd()); 659620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6597dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 659820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 65990ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0; 66000ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 660120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 66020ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1; 66030ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 66040ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_ArrayNeedsInitListOrWideStringLiteral: 66050ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2; 66060ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 66070ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_NarrowStringIntoWideCharArray: 66080ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg S.Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar); 66090ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 66100ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_WideStringIntoCharArray: 66110ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg S.Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char); 66120ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 66130ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_IncompatWideStringIntoWideChar: 66140ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg S.Diag(Kind.getLocation(), 66150ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg diag::err_array_init_incompat_wide_string_into_wchar); 661620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6617cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 6618cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 66192ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling S.Diag(Kind.getLocation(), 6620cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor (Failure == FK_ArrayTypeMismatch 6621cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ? diag::err_array_init_different_type 6622cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor : diag::err_array_init_non_constant_array)) 6623cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << DestType.getNonReferenceType() 6624cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getType() 6625cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getSourceRange(); 6626cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 6627cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 662873076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 662973076431605556fdbf28d287d084a73a24a8b8d4John McCall S.Diag(Kind.getLocation(), diag::err_variable_object_no_init) 663073076431605556fdbf28d287d084a73a24a8b8d4John McCall << Args[0]->getSourceRange(); 663173076431605556fdbf28d287d084a73a24a8b8d4John McCall break; 663273076431605556fdbf28d287d084a73a24a8b8d4John McCall 66336bb8017bb9e828d118e15e59d71c66bba323c364John McCall case FK_AddressOfOverloadFailed: { 66346bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 6635dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.ResolveAddressOfOverloadedFunction(Args[0], 663620093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 66376bb8017bb9e828d118e15e59d71c66bba323c364John McCall true, 66386bb8017bb9e828d118e15e59d71c66bba323c364John McCall Found); 663920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 66406bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 6641dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 664220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 66434a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 664420093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 664520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 664618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 664718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 664818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 664918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 665018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 665118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 665218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 665318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 665418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 66551f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, Args); 665620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6657dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 665820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 6659288f76ad86d5de6433eef097a1a5caff0c922e85Larisse Voufo if (!S.RequireCompleteType(Kind.getLocation(), 66607419d013fd2c4dda596066f4864d5c40e85ba330Larisse Voufo DestType.getNonReferenceType(), 66617419d013fd2c4dda596066f4864d5c40e85ba330Larisse Voufo diag::err_typecheck_nonviable_condition_incomplete, 66627419d013fd2c4dda596066f4864d5c40e85ba330Larisse Voufo Args[0]->getType(), Args[0]->getSourceRange())) 66637419d013fd2c4dda596066f4864d5c40e85ba330Larisse Voufo S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 66647419d013fd2c4dda596066f4864d5c40e85ba330Larisse Voufo << Args[0]->getType() << Args[0]->getSourceRange() 66657419d013fd2c4dda596066f4864d5c40e85ba330Larisse Voufo << DestType.getNonReferenceType(); 66667419d013fd2c4dda596066f4864d5c40e85ba330Larisse Voufo 66671f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args); 666820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6669dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 667020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 667120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 667220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 667320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 667420093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 6675120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 66768fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best, 66778fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor true); 667820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 66796c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.NoteDeletedFunction(Best->Function); 668020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 66819f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 668220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 668320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 668420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 6685dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 668620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 66879f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 668820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 668920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6690dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 669120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 669213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (isa<InitListExpr>(Args[0])) { 669313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Diag(Kind.getLocation(), 669413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl diag::err_lvalue_reference_bind_to_initlist) 669513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << DestType.getNonReferenceType().isVolatileQualified() 669613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << DestType.getNonReferenceType() 669713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << Args[0]->getSourceRange(); 669813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 669913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 670013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Intentional fallthrough 670113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 670220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 6703dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Kind.getLocation(), 670420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 670520093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 670620093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 6707ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 670820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 670920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 671020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 671120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6712dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 671320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 671420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 6715fb5d7efc279335bde2cdc0a73da525d6b28201e9Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getType() 671620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 671720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6718dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 671920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 672020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 672120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 672220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 672320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 672420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6725dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 672620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 672720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 672820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 67297eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 673020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 673120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 67327cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall emitBadConversionNotes(S, Entity, Args[0]); 673320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 6734dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 67351be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor case FK_ConversionFailed: { 67361be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor QualType FromType = Args[0]->getType(); 67376efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed) 673818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 673920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 67407eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 67411be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor << FromType 674220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 67436efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu S.HandleFunctionTypeMismatch(PDiag, FromType, DestType); 67446efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu S.Diag(Kind.getLocation(), PDiag); 67457cca821e1acf0f1b4fe892c3111bfb2086832e4eJohn McCall emitBadConversionNotes(S, Entity, Args[0]); 6746d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 67471be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor } 6748429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 6749429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 6750429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley // No-op. This error has already been reported. 6751429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 6752429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 6753d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 675499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 675599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 675633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar auto *InitList = dyn_cast<InitListExpr>(Args[0]); 675733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar if (InitList && InitList->getNumInits() == 1) 675833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar R = SourceRange(InitList->getInit(0)->getLocEnd(), InitList->getLocEnd()); 6759dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi else 67601f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko R = SourceRange(Args.front()->getLocEnd(), Args.back()->getLocEnd()); 6761d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 67626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines R.setBegin(S.getLocForEndOfToken(R.getBegin())); 676319311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor if (Kind.isCStyleOrFunctionalCast()) 676419311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg) 676519311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << R; 676619311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor else 676719311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 676819311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << /*scalar=*/2 << R; 6769d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 6770d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 6771d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 6772d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 6773d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 6774d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 6775d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 6776d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 6777d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 6778d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 6779d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 6780d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 6781dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6782cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl case FK_ListConstructorOverloadFailed: 678351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 678451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 67851f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko if (Args.size()) 67861f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko ArgsRange = SourceRange(Args.front()->getLocStart(), 67871f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Args.back()->getLocEnd()); 6788dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6789cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl if (Failure == FK_ListConstructorOverloadFailed) { 6790c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines assert(Args.size() == 1 && 6791c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines "List construction from other than 1 argument."); 6792cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitListExpr *InitList = cast<InitListExpr>(Args[0]); 67931f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko Args = MultiExprArg(InitList->getInits(), InitList->getNumInits()); 6794cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl } 6795cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl 679651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 679751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 679851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 679951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 680051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 680151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 68021f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, Args); 680351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 6804dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 680551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 68069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 68079db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 68089db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 68099db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 68109db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 68119db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 68129db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 68139db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 68149db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 68159db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 68169db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 68179db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 681807b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith << (Constructor->getInheritedConstructor() ? 2 : 681907b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith Constructor->isImplicit() ? 1 : 0) 68209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 68219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 68229db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 68239db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 68249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 68259db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 68269db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 68279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 68289db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 68299db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 68309db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 683107b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith << (Constructor->getInheritedConstructor() ? 2 : 683207b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith Constructor->isImplicit() ? 1 : 0) 68339db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 68349db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 68359db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 6836c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines S.Diag(Entity.getDecl()->getLocation(), 6837c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::note_member_declared_at); 68389db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 68399db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 68409db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 6841dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Record->getDecl()->getLocation(), 68429db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 68439db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 68449db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 68459db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 68469db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 68479db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 684851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 684951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 68501f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args); 685151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 6852dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 685351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 685451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 6855120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 6856120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best); 6857e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor if (Ovl != OR_Deleted) { 6858e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 6859e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor << true << DestType << ArgsRange; 686051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 6861e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor break; 686251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 6863e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor 6864e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor // If this is a defaulted or implicitly-declared function, then 6865e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor // it was implicitly deleted. Make it clear that the deletion was 6866e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor // implicit. 68676c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith if (S.isImplicitlyDeleted(Best->Function)) 6868e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init) 68696c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith << S.getSpecialMember(cast<CXXMethodDecl>(Best->Function)) 6870e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor << DestType << ArgsRange; 68716c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith else 68726c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 68736c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith << true << DestType << ArgsRange; 68746c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith 68756c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.NoteDeletedFunction(Best->Function); 687651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 687751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 6878dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 687951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 688051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 688151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 688251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 68839fdefb338ead088dd7a5dd4ff3df807586b26d41David Blaikie break; 6884dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 688599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 68869db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 68879db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 68889db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 68899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 68909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 68919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 68929db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 689307b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith << (Constructor->getInheritedConstructor() ? 2 : 689407b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith Constructor->isImplicit() ? 1 : 0) 68959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 68969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 68979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 68989db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 68999db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 69009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 69019db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 6902176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << DestType << (bool)DestType->getAs<RecordType>(); 6903176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines maybeEmitZeroInitializationFixit(S, *this, Entity); 69049db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 690599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 6906dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 69078713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_Incomplete: 690869a30b838c723cb1850de55cfa48a402cfeeb6e0Douglas Gregor S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType, 69098713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl diag::err_init_incomplete_type); 69108713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl break; 69118713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 691214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl case FK_ListInitializationFailed: { 691314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Run the init list checker again to emit diagnostics. 69142ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling InitListExpr *InitList = cast<InitListExpr>(Args[0]); 69152ca3db4876207a0f2d9ed683b0d3b6f3193f39bcBill Wendling diagnoseListInit(S, Entity, InitList); 691614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl break; 691714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 69185acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 69195acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: { 69205acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall // FIXME: Already diagnosed! 69215acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 69225acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall } 69232b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 692470e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl case FK_ExplicitConstructor: { 692570e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl S.Diag(Kind.getLocation(), diag::err_selected_explicit_constructor) 692670e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl << Args[0]->getSourceRange(); 692770e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl OverloadCandidateSet::iterator Best; 692870e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl OverloadingResult Ovl 692970e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best); 6930e7d0bbfa101d0f0b955c04c417b5e3283497a7edMatt Beaumont-Gay (void)Ovl; 693170e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl assert(Ovl == OR_Success && "Inconsistent overload resolution"); 693270e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function); 693370e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl S.Diag(CtorDecl->getLocation(), diag::note_constructor_declared_here); 693470e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl break; 693570e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl } 693620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 6937dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6938a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 693920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 694020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 694118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 69425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid InitializationSequence::dump(raw_ostream &OS) const { 6943de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 6944de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 6945de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 6946de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 6947de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 6948de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 6949de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6950dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6951de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 6952de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 6953de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6954dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6955de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 6956de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 6957de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6958dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 69590ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_ArrayNeedsInitListOrWideStringLiteral: 69600ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg OS << "array requires initializer list or wide string literal"; 69610ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 69620ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg 69630ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_NarrowStringIntoWideCharArray: 69640ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg OS << "narrow string into wide char array"; 69650ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 69660ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg 69670ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_WideStringIntoCharArray: 69680ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg OS << "wide string into char array"; 69690ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 69700ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg 69710ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg case FK_IncompatWideStringIntoWideChar: 69720ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg OS << "incompatible wide string into wide char array"; 69730ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg break; 69740ff5074f37a66bca244a9d5d0da050ff68693ce2Hans Wennborg 6975cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 6976cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array type mismatch"; 6977cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 6978cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 6979cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 6980cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "non-constant array initializer"; 6981cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 6982cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 6983de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 6984de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 6985de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6986dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6987de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 6988de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 6989de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6990dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6991de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 6992de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 6993de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6994dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6995de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 6996de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 6997de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6998dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6999de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 7000de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 7001de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7002dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7003de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 7004de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 7005de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7006dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7007de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 7008de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 7009de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7010dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7011de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 7012de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 7013de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7014dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7015429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 7016429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley OS << "conversion from property failed"; 7017429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 7018429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 7019de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 7020de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 7021de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7022dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7023de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 7024de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 7025de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7026dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7027de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 7028de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 7029de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7030dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7031de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 7032de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 7033de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7034dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7035de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 7036de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 7037de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7038dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7039de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 7040de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 7041de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7042dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 704372a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 704472a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor OS << "initialization of incomplete type"; 704572a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor break; 70468713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 70478713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_ListInitializationFailed: 704814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl OS << "list initialization checker failure"; 70495acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 70505acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 705173076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 705273076431605556fdbf28d287d084a73a24a8b8d4John McCall OS << "variable length array has an initializer"; 705373076431605556fdbf28d287d084a73a24a8b8d4John McCall break; 705473076431605556fdbf28d287d084a73a24a8b8d4John McCall 70555acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: 70565acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall OS << "initializer expression isn't contextually valid"; 70575acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 7058b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky 7059b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky case FK_ListConstructorOverloadFailed: 7060b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky OS << "list constructor overloading failed"; 7061b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky break; 70622b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 706370e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl case FK_ExplicitConstructor: 706470e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl OS << "list copy initialization chose explicit constructor"; 706570e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl break; 7066dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 7067de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 7068de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 7069de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 7070dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7071de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 70727491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Dependent sequence\n"; 7073de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 7074dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 70757491c499e826682e128a400038361ebcbde30eecSebastian Redl case NormalSequence: 70767491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Normal sequence: "; 7077de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7078de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 7079dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7080de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 7081de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 7082de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 7083de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 7084dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7085de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 7086de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 7087de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 7088de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7089dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7090de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 7091de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 7092de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7093dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7094906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 7095906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "derived-to-base case (xvalue" << S->Type.getAsString() << ")"; 7096906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 7097dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7098de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 7099de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 7100de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7101dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7102de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 7103de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 7104de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7105dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7106de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 7107de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 7108de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7109dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7110523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 7111523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor OS << "extraneous C++03 copy to temporary"; 7112523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 7113523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 7114de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 7115b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << "user-defined conversion via " << *S->Function.Function; 7116de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7117906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 7118de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 7119de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 712013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 7121de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 7122906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 7123906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "qualification conversion (xvalue)"; 712413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 7125906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 7126de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 7127de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 7128de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7129dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_AtomicConversion: 7131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OS << "non-atomic-to-atomic conversion"; 7132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 7133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 71341fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose case SK_LValueToRValue: 71351fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose OS << "load (lvalue to rvalue)"; 71361fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose break; 71371fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose 7138de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 7139de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 71402f8b0cc5fa808368a4f84806a60a1254b772caeaDouglas Gregor S->ICS->dump(); // FIXME: use OS 7141de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 7142de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7143dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 714413b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith case SK_ConversionSequenceNoNarrowing: 714513b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith OS << "implicit conversion sequence with narrowing prohibited ("; 71462f8b0cc5fa808368a4f84806a60a1254b772caeaDouglas Gregor S->ICS->dump(); // FIXME: use OS 714713b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith OS << ")"; 714813b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith break; 714913b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith 7150de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 71518713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl OS << "list aggregate initialization"; 71528713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl break; 71538713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 715413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 715513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl OS << "unwrap reference initializer list"; 715613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 715713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 715813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 715913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl OS << "rewrap reference initializer list"; 716013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 716113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 7162de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 7163de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 7164de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7165dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_ConstructorInitializationFromList: 7167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OS << "list initialization via constructor"; 7168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 7169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 7170de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 7171de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 7172de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7173dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7174de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 7175de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 7176de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7177dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 7178de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 7179de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 7180de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 7181569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 7182569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 7183569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor OS << "Objective-C object conversion"; 7184569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 7185cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 7186cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 7187cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array initialization"; 7188cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 7189f85e193739c953358c865005855253af4f68a497John McCall 71900f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith case SK_ParenthesizedArrayInit: 71910f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith OS << "parenthesized array initialization"; 71920f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith break; 71930f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith 7194f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 7195f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect copy and restore"; 7196f85e193739c953358c865005855253af4f68a497John McCall break; 7197f85e193739c953358c865005855253af4f68a497John McCall 7198f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 7199f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect restore"; 7200f85e193739c953358c865005855253af4f68a497John McCall break; 7201f85e193739c953358c865005855253af4f68a497John McCall 7202f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 7203f85e193739c953358c865005855253af4f68a497John McCall OS << "Objective-C object retension"; 7204f85e193739c953358c865005855253af4f68a497John McCall break; 72052b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 72062b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: 72072b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl OS << "std::initializer_list from initializer list"; 72082b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 7209e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 7210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case SK_StdInitializerListConstructorCall: 7211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OS << "list initialization from std::initializer_list"; 7212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 7213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 721421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case SK_OCLSamplerInit: 721521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei OS << "OpenCL sampler_t from integer constant"; 721621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei break; 721721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 7218e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_OCLZeroEvent: 7219e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei OS << "OpenCL event_t from zero"; 7220e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei break; 7221de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 7222a4dc51b46861eb52626f89183da7610437baba93Richard Smith 7223a4dc51b46861eb52626f89183da7610437baba93Richard Smith OS << " [" << S->Type.getAsString() << ']'; 7224de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 7225a4dc51b46861eb52626f89183da7610437baba93Richard Smith 7226a4dc51b46861eb52626f89183da7610437baba93Richard Smith OS << '\n'; 7227de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 7228de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 7229de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 7230de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 7231de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 7232de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 723313b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smithstatic void DiagnoseNarrowingInInitList(Sema &S, 723413b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith const ImplicitConversionSequence &ICS, 723513b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith QualType PreNarrowingType, 72364c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith QualType EntityType, 72374c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const Expr *PostInit) { 72386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const StandardConversionSequence *SCS = nullptr; 72394c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith switch (ICS.getKind()) { 72404c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::StandardConversion: 72414c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith SCS = &ICS.Standard; 72424c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 72434c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::UserDefinedConversion: 72444c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith SCS = &ICS.UserDefined.After; 72454c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 72464c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::AmbiguousConversion: 72474c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::EllipsisConversion: 72484c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::BadConversion: 72494c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 72504c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith } 72514c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 72524c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion. 72534c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith APValue ConstantValue; 7254f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith QualType ConstantType; 7255f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue, 7256f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith ConstantType)) { 72574c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Not_Narrowing: 72584c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // No narrowing occurred. 72594c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 72604c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 72614c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Type_Narrowing: 72624c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // This was a floating-to-integer conversion, which is always considered a 72634c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // narrowing conversion even if the value is a constant and can be 72644c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // represented exactly as an integer. 72654c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 72663347b497157d36cf280d1d9f52956faa6e702f34Richard Smith (S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11) 72673347b497157d36cf280d1d9f52956faa6e702f34Richard Smith ? diag::warn_init_list_type_narrowing 72683347b497157d36cf280d1d9f52956faa6e702f34Richard Smith : diag::ext_init_list_type_narrowing) 72694c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 72704c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PreNarrowingType.getLocalUnqualifiedType() 72714c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << EntityType.getLocalUnqualifiedType(); 72724c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 72734c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 72744c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Constant_Narrowing: 72754c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // A constant value was narrowed. 72764c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 72773347b497157d36cf280d1d9f52956faa6e702f34Richard Smith (S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11) 72783347b497157d36cf280d1d9f52956faa6e702f34Richard Smith ? diag::warn_init_list_constant_narrowing 72793347b497157d36cf280d1d9f52956faa6e702f34Richard Smith : diag::ext_init_list_constant_narrowing) 72804c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 7281f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith << ConstantValue.getAsString(S.getASTContext(), ConstantType) 72829906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << EntityType.getLocalUnqualifiedType(); 72834c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 72844c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 72854c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Variable_Narrowing: 72864c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // A variable's value may have been narrowed. 72874c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 72883347b497157d36cf280d1d9f52956faa6e702f34Richard Smith (S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11) 72893347b497157d36cf280d1d9f52956faa6e702f34Richard Smith ? diag::warn_init_list_variable_narrowing 72903347b497157d36cf280d1d9f52956faa6e702f34Richard Smith : diag::ext_init_list_variable_narrowing) 72914c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 72924c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PreNarrowingType.getLocalUnqualifiedType() 72939906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << EntityType.getLocalUnqualifiedType(); 72944c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 72954c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith } 7296191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 7297f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> StaticCast; 7298191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::raw_svector_ostream OS(StaticCast); 7299191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << "static_cast<"; 7300191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (const TypedefType *TT = EntityType->getAs<TypedefType>()) { 7301191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // It's important to use the typedef's name if there is one so that the 7302191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // fixit doesn't break code using types like int64_t. 7303191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // 7304191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // FIXME: This will break if the typedef requires qualification. But 7305191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // getQualifiedNameAsString() includes non-machine-parsable components. 7306b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *TT->getDecl(); 7307191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>()) 73084e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie OS << BT->getName(S.getLangOpts()); 7309191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin else { 7310191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Oops, we didn't find the actual type of the variable. Don't emit a fixit 7311191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // with a broken cast. 7312191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return; 7313191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 7314191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << ">("; 73156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines S.Diag(PostInit->getLocStart(), diag::note_init_list_narrowing_silence) 73166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << PostInit->getSourceRange() 73176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << FixItHint::CreateInsertion(PostInit->getLocStart(), OS.str()) 73186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << FixItHint::CreateInsertion( 73196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines S.getLocForEndOfToken(PostInit->getLocEnd()), ")"); 7320191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin} 7321191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 732218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 732318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 732418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 73252be7e90b81509204b99b7bbf9753ad17b894a12aSean Huntbool 73262be7e90b81509204b99b7bbf9753ad17b894a12aSean HuntSema::CanPerformCopyInitialization(const InitializedEntity &Entity, 73272be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt ExprResult Init) { 73282be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt if (Init.isInvalid()) 73292be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt return false; 73302be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 73312be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt Expr *InitE = Init.get(); 73322be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt assert(InitE && "No initialization expression"); 73332be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 73343c394c54511b27be0ff6968f159bba3521ab3c3eDouglas Gregor InitializationKind Kind 73353c394c54511b27be0ff6968f159bba3521ab3c3eDouglas Gregor = InitializationKind::CreateCopy(InitE->getLocStart(), SourceLocation()); 73361f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko InitializationSequence Seq(*this, Entity, Kind, InitE); 7337383616cd2e61131a534afd9364ef53f643e1f834Sebastian Redl return !Seq.Failed(); 73382be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt} 73392be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 7340dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 734118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 734218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 7343191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ExprResult Init, 7344ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool TopLevelOfInitList, 7345ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowExplicit) { 734618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 734718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 734818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 734915d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall Expr *InitE = Init.get(); 735018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 735118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 735218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 735318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 735418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 735518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 7356ed878af7914df535b32d64f555fa118413186672Douglas Gregor EqualLoc, 7357ed878af7914df535b32d64f555fa118413186672Douglas Gregor AllowExplicit); 735813b228dacb6154d8b48d2f3a51e4e078fa7a7b9eRichard Smith InitializationSequence Seq(*this, Entity, Kind, InitE, TopLevelOfInitList); 7359191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 73601f78a50f8aee58f8e07f6307f4b8d0b1742e9a2bDmitri Gribenko ExprResult Result = Seq.Perform(*this, Entity, Kind, InitE); 73614c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 73624c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return Result; 736318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 7364