@@ -1244,8 +1244,12 @@ class CXXThrowExpr : public Expr {
12441244// / This wraps up a function call argument that was created from the
12451245// / corresponding parameter's default argument, when the call did not
12461246// / explicitly supply arguments for all of the parameters.
1247- class CXXDefaultArgExpr final : public Expr {
1247+ class CXXDefaultArgExpr final
1248+ : public Expr,
1249+ private llvm::TrailingObjects<CXXDefaultArgExpr, Expr *> {
12481250 friend class ASTStmtReader ;
1251+ friend class ASTReader ;
1252+ friend TrailingObjects;
12491253
12501254 // / The parameter whose default is being used.
12511255 ParmVarDecl *Param;
@@ -1254,7 +1258,7 @@ class CXXDefaultArgExpr final : public Expr {
12541258 DeclContext *UsedContext;
12551259
12561260 CXXDefaultArgExpr (StmtClass SC, SourceLocation Loc, ParmVarDecl *Param,
1257- DeclContext *UsedContext)
1261+ Expr *RewrittenExpr, DeclContext *UsedContext)
12581262 : Expr(SC,
12591263 Param->hasUnparsedDefaultArg ()
12601264 ? Param->getType().getNonReferenceType()
@@ -1263,28 +1267,58 @@ class CXXDefaultArgExpr final : public Expr {
12631267 Param->getDefaultArg()->getObjectKind()),
12641268 Param(Param), UsedContext(UsedContext) {
12651269 CXXDefaultArgExprBits.Loc = Loc;
1270+ CXXDefaultArgExprBits.HasRewrittenInit = RewrittenExpr != nullptr ;
1271+ if (RewrittenExpr)
1272+ *getTrailingObjects<Expr *>() = RewrittenExpr;
12661273 setDependence (computeDependence (this ));
12671274 }
12681275
1276+ CXXDefaultArgExpr (EmptyShell Empty, bool HasRewrittenInit)
1277+ : Expr(CXXDefaultArgExprClass, Empty) {
1278+ CXXDefaultArgExprBits.HasRewrittenInit = HasRewrittenInit;
1279+ }
1280+
1281+ size_t numTrailingObjects () const {
1282+ return CXXDefaultArgExprBits.HasRewrittenInit ;
1283+ }
1284+
12691285public:
1270- CXXDefaultArgExpr (EmptyShell Empty) : Expr(CXXDefaultArgExprClass, Empty) {}
1286+ static CXXDefaultArgExpr *CreateEmpty (const ASTContext &C,
1287+ bool HasRewrittenInit);
12711288
12721289 // \p Param is the parameter whose default argument is used by this
12731290 // expression.
12741291 static CXXDefaultArgExpr *Create (const ASTContext &C, SourceLocation Loc,
1275- ParmVarDecl *Param,
1276- DeclContext *UsedContext) {
1277- return new (C)
1278- CXXDefaultArgExpr (CXXDefaultArgExprClass, Loc, Param, UsedContext);
1279- }
1280-
1292+ ParmVarDecl *Param, Expr *RewrittenExpr,
1293+ DeclContext *UsedContext);
12811294 // Retrieve the parameter that the argument was created from.
12821295 const ParmVarDecl *getParam () const { return Param; }
12831296 ParmVarDecl *getParam () { return Param; }
12841297
1285- // Retrieve the actual argument to the function call.
1286- const Expr *getExpr () const { return getParam ()->getDefaultArg (); }
1287- Expr *getExpr () { return getParam ()->getDefaultArg (); }
1298+ bool hasRewrittenInit () const {
1299+ return CXXDefaultArgExprBits.HasRewrittenInit ;
1300+ }
1301+
1302+ // Retrieve the argument to the function call.
1303+ Expr *getExpr ();
1304+ const Expr *getExpr () const {
1305+ return const_cast <CXXDefaultArgExpr *>(this )->getExpr ();
1306+ }
1307+
1308+ Expr *getRewrittenExpr () {
1309+ return hasRewrittenInit () ? *getTrailingObjects<Expr *>() : nullptr ;
1310+ }
1311+
1312+ const Expr *getRewrittenExpr () const {
1313+ return const_cast <CXXDefaultArgExpr *>(this )->getRewrittenExpr ();
1314+ }
1315+
1316+ // Retrieve the rewritten init expression (for an init expression containing
1317+ // immediate calls) with the top level FullExpr and ConstantExpr stripped off.
1318+ Expr *getAdjustedRewrittenExpr ();
1319+ const Expr *getAdjustedRewrittenExpr () const {
1320+ return const_cast <CXXDefaultArgExpr *>(this )->getAdjustedRewrittenExpr ();
1321+ }
12881322
12891323 const DeclContext *getUsedContext () const { return UsedContext; }
12901324 DeclContext *getUsedContext () { return UsedContext; }
@@ -1321,41 +1355,67 @@ class CXXDefaultArgExpr final : public Expr {
13211355// / is implicitly used in a mem-initializer-list in a constructor
13221356// / (C++11 [class.base.init]p8) or in aggregate initialization
13231357// / (C++1y [dcl.init.aggr]p7).
1324- class CXXDefaultInitExpr : public Expr {
1325- friend class ASTReader ;
1326- friend class ASTStmtReader ;
1358+ class CXXDefaultInitExpr final
1359+ : public Expr,
1360+ private llvm::TrailingObjects<CXXDefaultArgExpr, Expr *> {
13271361
1362+ friend class ASTStmtReader ;
1363+ friend class ASTReader ;
1364+ friend TrailingObjects;
13281365 // / The field whose default is being used.
13291366 FieldDecl *Field;
13301367
13311368 // / The context where the default initializer expression was used.
13321369 DeclContext *UsedContext;
13331370
13341371 CXXDefaultInitExpr (const ASTContext &Ctx, SourceLocation Loc,
1335- FieldDecl *Field, QualType Ty, DeclContext *UsedContext);
1372+ FieldDecl *Field, QualType Ty, DeclContext *UsedContext,
1373+ Expr *RewrittenInitExpr);
1374+
1375+ CXXDefaultInitExpr (EmptyShell Empty, bool HasRewrittenInit)
1376+ : Expr(CXXDefaultInitExprClass, Empty) {
1377+ CXXDefaultInitExprBits.HasRewrittenInit = HasRewrittenInit;
1378+ }
13361379
1337- CXXDefaultInitExpr (EmptyShell Empty) : Expr(CXXDefaultInitExprClass, Empty) {}
1380+ size_t numTrailingObjects () const {
1381+ return CXXDefaultInitExprBits.HasRewrittenInit ;
1382+ }
13381383
13391384public:
1385+ static CXXDefaultInitExpr *CreateEmpty (const ASTContext &C,
1386+ bool HasRewrittenInit);
13401387 // / \p Field is the non-static data member whose default initializer is used
13411388 // / by this expression.
13421389 static CXXDefaultInitExpr *Create (const ASTContext &Ctx, SourceLocation Loc,
1343- FieldDecl *Field, DeclContext *UsedContext) {
1344- return new (Ctx) CXXDefaultInitExpr (Ctx, Loc, Field, Field->getType (), UsedContext);
1390+ FieldDecl *Field, DeclContext *UsedContext,
1391+ Expr *RewrittenInitExpr);
1392+
1393+ bool hasRewrittenInit () const {
1394+ return CXXDefaultInitExprBits.HasRewrittenInit ;
13451395 }
13461396
13471397 // / Get the field whose initializer will be used.
13481398 FieldDecl *getField () { return Field; }
13491399 const FieldDecl *getField () const { return Field; }
13501400
13511401 // / Get the initialization expression that will be used.
1402+ Expr *getExpr ();
13521403 const Expr *getExpr () const {
1353- assert (Field->getInClassInitializer () && " initializer hasn't been parsed" );
1354- return Field->getInClassInitializer ();
1404+ return const_cast <CXXDefaultInitExpr *>(this )->getExpr ();
1405+ }
1406+
1407+ // / Retrieve the initializing expression with evaluated immediate calls, if
1408+ // / any.
1409+ const Expr *getRewrittenExpr () const {
1410+ assert (hasRewrittenInit () && " expected a rewritten init expression" );
1411+ return *getTrailingObjects<Expr *>();
13551412 }
1356- Expr *getExpr () {
1357- assert (Field->getInClassInitializer () && " initializer hasn't been parsed" );
1358- return Field->getInClassInitializer ();
1413+
1414+ // / Retrieve the initializing expression with evaluated immediate calls, if
1415+ // / any.
1416+ Expr *getRewrittenExpr () {
1417+ assert (hasRewrittenInit () && " expected a rewritten init expression" );
1418+ return *getTrailingObjects<Expr *>();
13591419 }
13601420
13611421 const DeclContext *getUsedContext () const { return UsedContext; }
0 commit comments