Skip to content

Commit cdbc95a

Browse files
committed
Fixing an issue with super restriction state in undodefer case
We currently store the status of whether super call is allowed or super property is allowed in the Parser. Because of this when we do an undodefer of a member function that state information gets lost. This change is to put that information in the function node itself and use it from there while parsing super references.
1 parent 841036a commit cdbc95a

File tree

6 files changed

+65
-77
lines changed

6 files changed

+65
-77
lines changed

lib/Parser/Parse.cpp

Lines changed: 25 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,6 @@ Parser::Parser(Js::ScriptContext* scriptContext, BOOL strictMode, PageAllocator
120120
m_funcInArray(0),
121121
m_scopeCountNoAst(0),
122122

123-
m_parsingSuperRestrictionState(ParsingSuperRestrictionState_SuperDisallowed),
124-
125123
m_funcParenExprDepth(0),
126124
m_deferEllipsisError(false),
127125
m_deferEllipsisErrorLoc(), // calls default initializer
@@ -353,11 +351,6 @@ HRESULT Parser::ParseSourceInternal(
353351

354352
try
355353
{
356-
if ((grfscr & fscrEvalCode) != 0)
357-
{
358-
this->m_parsingSuperRestrictionState = Parser::ParsingSuperRestrictionState_SuperPropertyAllowed;
359-
}
360-
361354
if ((grfscr & fscrIsModuleCode) != 0)
362355
{
363356
// Module source flag should not be enabled unless module is enabled
@@ -985,6 +978,7 @@ ParseNodeProg * Parser::CreateProgNode(bool isModuleSource, ULONG lineNumber)
985978
pnodeProg->cbMin = this->GetScanner()->IecpMinTok();
986979
pnodeProg->lineNumber = lineNumber;
987980
pnodeProg->homeObjLocation = Js::Constants::NoRegister;
981+
pnodeProg->superRestrictionState = SuperRestrictionState::Disallowed;
988982
return pnodeProg;
989983
}
990984

@@ -3074,7 +3068,7 @@ ParseNodePtr Parser::ParseTerm(BOOL fAllowCall,
30743068
{
30753069
Assert((stub->fncFlags & kFunctionIsLambda) == kFunctionIsLambda);
30763070

3077-
pnode = ParseFncDeclCheckScope<true>(fFncLambda, /* resetParsingSuperRestrictionState*/ false);
3071+
pnode = ParseFncDeclCheckScope<true>(fFncLambda);
30783072
break;
30793073
}
30803074
}
@@ -3342,7 +3336,7 @@ ParseNodePtr Parser::ParseTerm(BOOL fAllowCall,
33423336
{
33433337
flags |= fFncAsync;
33443338
}
3345-
pnode = ParseFncDeclNoCheckScope<buildAST>(flags, pNameHint, false, true, fUnaryOrParen);
3339+
pnode = ParseFncDeclNoCheckScope<buildAST>(flags, SuperRestrictionState::Disallowed, pNameHint, false, true, fUnaryOrParen);
33463340
if (isAsyncExpr)
33473341
{
33483342
pnode->AsParseNodeFnc()->cbMin = iecpMin;
@@ -4310,10 +4304,8 @@ ParseNodeBin * Parser::ParseMemberGetSet(OpCode nop, LPCOLESTR* ppNameHint)
43104304
flags |= fFncOneArg;
43114305
}
43124306

4313-
AutoParsingSuperRestrictionStateRestorer restorer(this);
4314-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperPropertyAllowed;
4315-
ParseNodeFnc * pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(flags, *ppNameHint,
4316-
/*needsPIDOnRCurlyScan*/ false, /*resetParsingSuperRestrictionState*/ false);
4307+
ParseNodeFnc * pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(flags, SuperRestrictionState::PropertyAllowed, *ppNameHint,
4308+
/*needsPIDOnRCurlyScan*/ false);
43174309

43184310
if (isComputedName)
43194311
{
@@ -4634,10 +4626,8 @@ ParseNodePtr Parser::ParseMemberList(LPCOLESTR pNameHint, uint32* pNameHintLengt
46344626
// Rewind to the PID and parse a function expression.
46354627
this->GetScanner()->SeekTo(atPid);
46364628

4637-
AutoParsingSuperRestrictionStateRestorer restorer(this);
4638-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperPropertyAllowed;
4639-
ParseNodeFnc * pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags | (isAsyncMethod ? fFncAsync : fFncNoFlgs), pFullNameHint,
4640-
/*needsPIDOnRCurlyScan*/ false, /*resetParsingSuperRestrictionState*/ false);
4629+
ParseNodeFnc * pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags | (isAsyncMethod ? fFncAsync : fFncNoFlgs), SuperRestrictionState::PropertyAllowed, pFullNameHint,
4630+
/*needsPIDOnRCurlyScan*/ false);
46414631

46424632
if (isAsyncMethod || isGenerator)
46434633
{
@@ -4849,7 +4839,7 @@ BOOL Parser::IsDeferredFnc()
48494839
}
48504840

48514841
template<bool buildAST>
4852-
ParseNode * Parser::ParseFncDeclCheckScope(ushort flags, bool resetParsingSuperRestrictionState, bool fAllowIn)
4842+
ParseNode * Parser::ParseFncDeclCheckScope(ushort flags, bool fAllowIn)
48534843
{
48544844
ParseNodeBlock * pnodeFncBlockScope = nullptr;
48554845
ParseNodePtr *ppnodeScopeSave = nullptr;
@@ -4877,7 +4867,7 @@ ParseNode * Parser::ParseFncDeclCheckScope(ushort flags, bool resetParsingSuperR
48774867
}
48784868
}
48794869

4880-
ParseNodeFnc * pnodeFnc = ParseFncDeclInternal<buildAST>(flags, nullptr, /* needsPIDOnRCurlyScan */ false, resetParsingSuperRestrictionState, /* fUnaryOrParen */ false, noStmtContext, fAllowIn);
4870+
ParseNodeFnc * pnodeFnc = ParseFncDeclInternal<buildAST>(flags, nullptr, /* needsPIDOnRCurlyScan */ false, /* fUnaryOrParen */ false, noStmtContext, SuperRestrictionState::Disallowed, fAllowIn);
48814871

48824872
if (pnodeFncBlockScope)
48834873
{
@@ -4896,22 +4886,15 @@ ParseNode * Parser::ParseFncDeclCheckScope(ushort flags, bool resetParsingSuperR
48964886
}
48974887

48984888
template<bool buildAST>
4899-
ParseNodeFnc * Parser::ParseFncDeclNoCheckScope(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool resetParsingSuperRestrictionState, bool fUnaryOrParen, bool fAllowIn)
4889+
ParseNodeFnc * Parser::ParseFncDeclNoCheckScope(ushort flags, SuperRestrictionState::State superRestrictionState, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool fUnaryOrParen, bool fAllowIn)
49004890
{
49014891
Assert((flags & fFncDeclaration) == 0);
4902-
return ParseFncDeclInternal<buildAST>(flags, pNameHint, needsPIDOnRCurlyScan, resetParsingSuperRestrictionState, fUnaryOrParen, /* noStmtContext */ false, fAllowIn);
4892+
return ParseFncDeclInternal<buildAST>(flags, pNameHint, needsPIDOnRCurlyScan, fUnaryOrParen, /* noStmtContext */ false, superRestrictionState, fAllowIn);
49034893
}
49044894

49054895
template<bool buildAST>
4906-
ParseNodeFnc * Parser::ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool resetParsingSuperRestrictionState, bool fUnaryOrParen, bool noStmtContext, bool fAllowIn)
4896+
ParseNodeFnc * Parser::ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool fUnaryOrParen, bool noStmtContext, SuperRestrictionState::State superRestrictionState, bool fAllowIn)
49074897
{
4908-
AutoParsingSuperRestrictionStateRestorer restorer(this);
4909-
if (resetParsingSuperRestrictionState)
4910-
{
4911-
// ParseFncDecl will always reset m_parsingSuperRestrictionState to super disallowed unless explicitly disabled
4912-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperDisallowed;
4913-
}
4914-
49154898
ParseNodeFnc * pnodeFnc = nullptr;
49164899
ParseNodePtr *ppnodeVarSave = nullptr;
49174900

@@ -4947,6 +4930,7 @@ ParseNodeFnc * Parser::ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, c
49474930
pnodeFnc->nestedFuncEscapes = false;
49484931
pnodeFnc->cbMin = this->GetScanner()->IecpMinTok();
49494932
pnodeFnc->functionId = (*m_nextFunctionId)++;
4933+
pnodeFnc->superRestrictionState = superRestrictionState;
49504934

49514935

49524936
// Push new parser state with this new function node
@@ -6713,7 +6697,7 @@ void Parser::ParseFncFormals(ParseNodeFnc * pnodeFnc, ParseNodeFnc * pnodeParent
67136697
template<bool buildAST>
67146698
ParseNodePtr Parser::GenerateModuleFunctionWrapper()
67156699
{
6716-
ParseNodePtr pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fFncModule, nullptr, false, true, true);
6700+
ParseNodePtr pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fFncModule, SuperRestrictionState::Disallowed, nullptr, false, true, true);
67176701
ParseNodePtr callNode = CreateCallNode(knopCall, pnodeFnc, nullptr);
67186702

67196703
return callNode;
@@ -7402,24 +7386,6 @@ LPCOLESTR Parser::ConstructFinalHintNode(IdentPtr pClassName, IdentPtr pMemberNa
74027386
return pFinalName;
74037387
}
74047388

7405-
class AutoParsingSuperRestrictionStateRestorer
7406-
{
7407-
public:
7408-
AutoParsingSuperRestrictionStateRestorer(Parser* parser) : m_parser(parser)
7409-
{
7410-
AssertMsg(this->m_parser != nullptr, "This just should not happen");
7411-
this->m_originalParsingSuperRestrictionState = this->m_parser->m_parsingSuperRestrictionState;
7412-
}
7413-
~AutoParsingSuperRestrictionStateRestorer()
7414-
{
7415-
AssertMsg(this->m_parser != nullptr, "This just should not happen");
7416-
this->m_parser->m_parsingSuperRestrictionState = m_originalParsingSuperRestrictionState;
7417-
}
7418-
private:
7419-
Parser * m_parser;
7420-
int m_originalParsingSuperRestrictionState;
7421-
};
7422-
74237389
template<bool buildAST>
74247390
ParseNodeClass * Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, uint32 *pHintLength, uint32 *pShortNameOffset)
74257391
{
@@ -7628,12 +7594,11 @@ ParseNodeClass * Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint,
76287594
}
76297595

76307596
{
7631-
AutoParsingSuperRestrictionStateRestorer restorer(this);
7632-
this->m_parsingSuperRestrictionState = hasExtends ? ParsingSuperRestrictionState_SuperCallAndPropertyAllowed : ParsingSuperRestrictionState_SuperPropertyAllowed;
7597+
SuperRestrictionState::State state = hasExtends ? SuperRestrictionState::CallAndPropertyAllowed : SuperRestrictionState::PropertyAllowed;
76337598

76347599
// Add the class constructor flag and base class constructor flag if pnodeExtends is nullptr
76357600
fncDeclFlags |= fFncClassConstructor | (hasExtends ? kFunctionNone : fFncBaseClassConstructor);
7636-
pnodeConstructor = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags, pConstructorName, /* needsPIDOnRCurlyScan */ true, /* resetParsingSuperRestrictionState = */false);
7601+
pnodeConstructor = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags, state, pConstructorName, /* needsPIDOnRCurlyScan */ true);
76377602
}
76387603

76397604
if (pnodeConstructor->IsGenerator())
@@ -7695,11 +7660,8 @@ ParseNodeClass * Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint,
76957660

76967661
ParseNodeFnc * pnodeFnc = nullptr;
76977662
{
7698-
AutoParsingSuperRestrictionStateRestorer restorer(this);
7699-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperPropertyAllowed;
77007663
pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags | (isGetter ? fFncNoArg : fFncOneArg),
7701-
pidHint ? pidHint->Psz() : nullptr, /* needsPIDOnRCurlyScan */ true,
7702-
/* resetParsingSuperRestrictionState */false);
7664+
SuperRestrictionState::PropertyAllowed, pidHint ? pidHint->Psz() : nullptr, /* needsPIDOnRCurlyScan */ true);
77037665
}
77047666

77057667
pnodeFnc->SetIsStaticMember(isStatic);
@@ -7727,14 +7689,11 @@ ParseNodeClass * Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint,
77277689

77287690
ParseNodeFnc * pnodeFnc = nullptr;
77297691
{
7730-
AutoParsingSuperRestrictionStateRestorer restorer(this);
7731-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperPropertyAllowed;
7732-
77337692
if (isAsyncMethod)
77347693
{
77357694
fncDeclFlags |= fFncAsync;
77367695
}
7737-
pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags, pidHint ? pidHint->Psz() : nullptr, /* needsPIDOnRCurlyScan */ true, /* resetParsingSuperRestrictionState */false);
7696+
pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags, SuperRestrictionState::PropertyAllowed, pidHint ? pidHint->Psz() : nullptr, /* needsPIDOnRCurlyScan */ true);
77387697
if (isAsyncMethod)
77397698
{
77407699
pnodeFnc->cbMin = iecpMin;
@@ -8847,7 +8806,7 @@ ParseNodePtr Parser::ParseExpr(int oplMin,
88478806
this->GetScanner()->SeekTo(termStart);
88488807
}
88498808
}
8850-
pnode = ParseFncDeclNoCheckScope<buildAST>(flags, nullptr, /* needsPIDOnRCurlyScan = */false, /* resetParsingSuperRestrictionState = */false, /* fUnaryOrParen = */ false, fAllowIn);
8809+
pnode = ParseFncDeclNoCheckScope<buildAST>(flags, SuperRestrictionState::Disallowed, nullptr, /* needsPIDOnRCurlyScan = */false, /* fUnaryOrParen = */ false, fAllowIn);
88518810
if (isAsyncMethod)
88528811
{
88538812
pnode->AsParseNodeFnc()->cbMin = iecpMin;
@@ -11490,7 +11449,7 @@ ParseNodeProg * Parser::Parse(LPCUTF8 pszSrc, size_t offset, size_t length, char
1149011449
flags |= fFncLambda;
1149111450
}
1149211451

11493-
ParseNode * pnodeFnc = ParseFncDeclCheckScope<true>(flags, /* resetParsingSuperRestrictionState*/ false);
11452+
ParseNode * pnodeFnc = ParseFncDeclCheckScope<true>(flags);
1149411453
pnodeProg->pnodeBody = nullptr;
1149511454
AddToNodeList(&pnodeProg->pnodeBody, &lastNodeRef, pnodeFnc);
1149611455

@@ -12302,6 +12261,7 @@ template <bool buildAST>
1230212261
IdentPtr Parser::ParseSuper(bool fAllowCall)
1230312262
{
1230412263
ParseNodeFnc * currentNodeFunc = GetCurrentFunctionNode();
12264+
ParseNodeFnc * currentNonLambdaFunc = GetCurrentNonLambdaFunctionNode();
1230512265
IdentPtr superPid = nullptr;
1230612266

1230712267
switch (m_token.tk)
@@ -12333,12 +12293,14 @@ IdentPtr Parser::ParseSuper(bool fAllowCall)
1233312293
{
1233412294
Error(ERRInvalidSuper); // new super() is not allowed
1233512295
}
12336-
else if (this->m_parsingSuperRestrictionState == ParsingSuperRestrictionState_SuperCallAndPropertyAllowed)
12296+
else if ((currentNodeFunc->IsConstructor() && currentNodeFunc->superRestrictionState == SuperRestrictionState::CallAndPropertyAllowed)
12297+
|| (currentNonLambdaFunc != nullptr && currentNonLambdaFunc->superRestrictionState == SuperRestrictionState::CallAndPropertyAllowed))
1233712298
{
1233812299
// Any super access is good within a class constructor
1233912300
}
12340-
else if (this->m_parsingSuperRestrictionState == ParsingSuperRestrictionState_SuperPropertyAllowed)
12301+
else if ((this->m_grfscr & fscrEval) == fscrEval || currentNonLambdaFunc->superRestrictionState == SuperRestrictionState::PropertyAllowed)
1234112302
{
12303+
// Currently for eval cases during compile time we use propertyallowed and throw during runtime for error cases
1234212304
if (m_token.tk == tkLParen)
1234312305
{
1234412306
if ((this->m_grfscr & fscrEval) == fscrNil)

lib/Parser/Parse.h

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -469,15 +469,6 @@ class Parser
469469
charcount_t m_funcInArray;
470470
uint m_scopeCountNoAst;
471471

472-
/*
473-
* Parsing states for super restriction
474-
*/
475-
static const uint ParsingSuperRestrictionState_SuperDisallowed = 0;
476-
static const uint ParsingSuperRestrictionState_SuperCallAndPropertyAllowed = 1;
477-
static const uint ParsingSuperRestrictionState_SuperPropertyAllowed = 2;
478-
uint m_parsingSuperRestrictionState;
479-
friend class AutoParsingSuperRestrictionStateRestorer;
480-
481472
// Used for issuing spread and rest errors when there is ambiguity with lambda parameter lists and parenthesized expressions
482473
uint m_funcParenExprDepth;
483474
bool m_deferEllipsisError;
@@ -805,9 +796,9 @@ class Parser
805796

806797
template<bool buildAST> void ParseComputedName(ParseNodePtr* ppnodeName, LPCOLESTR* ppNameHint, LPCOLESTR* ppFullNameHint = nullptr, uint32 *pNameLength = nullptr, uint32 *pShortNameOffset = nullptr);
807798
template<bool buildAST> ParseNodeBin * ParseMemberGetSet(OpCode nop, LPCOLESTR* ppNameHint);
808-
template<bool buildAST> ParseNode * ParseFncDeclCheckScope(ushort flags, bool resetParsingSuperRestrictionState = true, bool fAllowIn = true);
809-
template<bool buildAST> ParseNodeFnc * ParseFncDeclNoCheckScope(ushort flags, LPCOLESTR pNameHint = nullptr, const bool needsPIDOnRCurlyScan = false, bool resetParsingSuperRestrictionState = true, bool fUnaryOrParen = false, bool fAllowIn = true);
810-
template<bool buildAST> ParseNodeFnc * ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool resetParsingSuperRestrictionState, bool fUnaryOrParen, bool noStmtContext, bool fAllowIn = true);
799+
template<bool buildAST> ParseNode * ParseFncDeclCheckScope(ushort flags, bool fAllowIn = true);
800+
template<bool buildAST> ParseNodeFnc * ParseFncDeclNoCheckScope(ushort flags, SuperRestrictionState::State superRestrictionState = SuperRestrictionState::Disallowed, LPCOLESTR pNameHint = nullptr, const bool needsPIDOnRCurlyScan = false, bool fUnaryOrParen = false, bool fAllowIn = true);
801+
template<bool buildAST> ParseNodeFnc * ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool fUnaryOrParen, bool noStmtContext, SuperRestrictionState::State superRestrictionState = SuperRestrictionState::Disallowed, bool fAllowIn = true);
811802
template<bool buildAST> void ParseFncName(ParseNodeFnc * pnodeFnc, ushort flags, IdentPtr* pFncNamePid = nullptr);
812803
template<bool buildAST> void ParseFncFormals(ParseNodeFnc * pnodeFnc, ParseNodeFnc * pnodeParentFnc, ushort flags, bool isTopLevelDeferredFunc = false);
813804
template<bool buildAST> void ParseFncDeclHelper(ParseNodeFnc * pnodeFnc, LPCOLESTR pNameHint, ushort flags, bool fUnaryOrParen, bool noStmtContext, bool *pNeedScanRCurly, bool skipFormals = false, IdentPtr* pFncNamePid = nullptr, bool fAllowIn = true);

lib/Parser/ptree.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,8 @@ ParseNodeFnc::ParseNodeFnc(OpCode nop, charcount_t ichMin, charcount_t ichLim)
433433
#endif
434434
this->pRestorePoint = nullptr;
435435
this->deferredStub = nullptr;
436-
437436
this->capturedNames = nullptr;
437+
this->superRestrictionState = SuperRestrictionState::Disallowed;
438438
}
439439

440440
ParseNodeClass::ParseNodeClass(OpCode nop, charcount_t ichMin, charcount_t ichLim)

lib/Parser/ptree.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,14 @@ enum FncFlags : uint
455455
struct RestorePoint;
456456
struct DeferredFunctionStub;
457457

458+
namespace SuperRestrictionState {
459+
enum State {
460+
Disallowed = 0,
461+
CallAndPropertyAllowed = 1,
462+
PropertyAllowed = 2
463+
};
464+
}
465+
458466
// function declaration
459467
class ParseNodeFnc : public ParseNode
460468
{
@@ -504,6 +512,8 @@ class ParseNodeFnc : public ParseNode
504512

505513
static const int32 MaxStackClosureAST = 800000;
506514

515+
SuperRestrictionState::State superRestrictionState;
516+
507517
static bool CanBeRedeferred(FncFlags flags) { return !(flags & (kFunctionIsGenerator | kFunctionIsAsync)); }
508518

509519
private:

test/Bugs/SuperUndoDeferIssue.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//-------------------------------------------------------------------------------------------------------
2+
// Copyright (C) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4+
//-------------------------------------------------------------------------------------------------------
5+
6+
var obj = {
7+
mSloppy() {
8+
try {
9+
super[
10+
__v_12000] = 55;
11+
} catch (__v_12004) {
12+
}
13+
try {
14+
} catch (__v_12005) {
15+
}
16+
}
17+
};
18+
// There shouldn't be any SyntaxError
19+
print("PASSED");

test/Bugs/rlexe.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,5 +505,11 @@
505505
<default>
506506
<files>bug_OS17614914.js</files>
507507
</default>
508-
</test>
508+
</test>
509+
<test>
510+
<default>
511+
<files>SuperUndoDeferIssue.js</files>
512+
<compile-flags>-forceundodefer</compile-flags>
513+
</default>
514+
</test>
509515
</regress-exe>

0 commit comments

Comments
 (0)