@@ -8361,7 +8361,7 @@ ParamDecl *ParamDecl::createParsed(ASTContext &Context, SourceLoc specifierLoc,
83618361 defaultValue = nullptr ;
83628362 }
83638363
8364- decl->setDefaultExpr (defaultValue, false );
8364+ decl->setDefaultExpr (defaultValue);
83658365 decl->setDefaultArgumentKind (kind);
83668366
83678367 return decl;
@@ -8615,28 +8615,39 @@ Type ParamDecl::getTypeOfDefaultExpr() const {
86158615 return Type ();
86168616}
86178617
8618- void ParamDecl::setDefaultExpr (Expr *E, bool isTypeChecked) {
8619- if (!DefaultValueAndFlags.getPointer ()) {
8618+ void ParamDecl::setDefaultExpr (Expr *E) {
8619+ auto *defaultInfo = DefaultValueAndFlags.getPointer ();
8620+ if (defaultInfo) {
8621+ assert (defaultInfo->DefaultArg .isNull () ||
8622+ defaultInfo->DefaultArg .is <Expr *>());
8623+
8624+ auto *const oldE = defaultInfo->DefaultArg .dyn_cast <Expr *>();
8625+ assert ((bool )E == (bool )oldE && " Overwrite of non-null default with null" );
8626+ assert ((!oldE || !oldE->getType () || (bool )E->getType ()) &&
8627+ " Overwrite of type-checked default with non-type-checked default" );
8628+ } else {
86208629 if (!E) return ;
86218630
8622- DefaultValueAndFlags.setPointer (
8623- getASTContext ().Allocate <StoredDefaultArgument>());
8631+ defaultInfo = getASTContext ().Allocate <StoredDefaultArgument>();
8632+ DefaultValueAndFlags.setPointer (defaultInfo);
8633+
8634+ defaultInfo->InitContextAndIsTypeChecked .setInt (false );
86248635 }
86258636
8626- auto *defaultInfo = DefaultValueAndFlags.getPointer ();
8627- assert (defaultInfo->DefaultArg .isNull () ||
8628- defaultInfo->DefaultArg .is <Expr *>());
8637+ defaultInfo->DefaultArg = E;
8638+ }
8639+
8640+ void ParamDecl::setTypeCheckedDefaultExpr (Expr *E) {
8641+ assert (E || getDefaultArgumentKind () == DefaultArgumentKind::Inherited);
8642+ setDefaultExpr (E);
86298643
8630- if (!isTypeChecked) {
8631- assert (!defaultInfo->InitContextAndIsTypeChecked .getInt () &&
8632- " Can't overwrite type-checked default with un-type-checked default" );
8644+ auto *defaultInfo = DefaultValueAndFlags.getPointer ();
8645+ if (!defaultInfo) {
8646+ defaultInfo = getASTContext ().Allocate <StoredDefaultArgument>();
8647+ DefaultValueAndFlags.setPointer (defaultInfo);
86338648 }
8634- defaultInfo->DefaultArg = E;
8635- // `Inherited` default arguments do not have an expression,
8636- // so if the storage has been pre-allocated already we need
8637- // to be careful requesting type here.
8638- defaultInfo->ExprType = E ? E->getType () : Type ();
8639- defaultInfo->InitContextAndIsTypeChecked .setInt (isTypeChecked);
8649+
8650+ defaultInfo->InitContextAndIsTypeChecked .setInt (true );
86408651}
86418652
86428653void ParamDecl::setDefaultExprType (Type type) {
0 commit comments