зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1536736. Allow constexpr things in the MOZ_CAN_RUN_SCRIPT analysis. r=andi
Since these are compile-time constants, they can't exactly go away on us due to running script, right? Differential Revision: https://phabricator.services.mozilla.com/D24195 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
9679412967
Коммит
22b27ec802
|
@ -110,6 +110,10 @@ void CanRunScriptChecker::registerMatchers(MatchFinder *AstMatcher) {
|
|||
),
|
||||
// and which is not a parameter of the parent function,
|
||||
unless(declRefExpr(to(parmVarDecl()))),
|
||||
// and which is not a constexpr variable, since that must be
|
||||
// computable at compile-time and therefore isn't going to be going
|
||||
// away.
|
||||
unless(declRefExpr(to(varDecl(isConstexpr())))),
|
||||
// and which is not a default arg with value nullptr, since those are
|
||||
// always safe.
|
||||
unless(cxxDefaultArgExpr(isNullDefaultArg())),
|
||||
|
@ -130,7 +134,12 @@ void CanRunScriptChecker::registerMatchers(MatchFinder *AstMatcher) {
|
|||
// implicitCastExpr), but it's simpler to just use
|
||||
// ignoreTrivials to strip off the cast.
|
||||
ignoreTrivials(declRefExpr(to(parmVarDecl()))),
|
||||
cxxThisExpr()
|
||||
cxxThisExpr(),
|
||||
// We also allow dereferencing a constexpr variable here,
|
||||
// since that will just end up with a reference to the
|
||||
// compile-time-constant thing. Again, use ignoreTrivials()
|
||||
// to stip off the LValueToRValue cast.
|
||||
ignoreTrivials(declRefExpr(to(varDecl(isConstexpr()))))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
@ -437,3 +437,28 @@ struct DisallowRefPtrTArrayElement {
|
|||
test2(mArray[0]); // expected-error {{arguments must all be strong refs or parent parameters when calling a function marked as MOZ_CAN_RUN_SCRIPT (including the implicit object argument)}}
|
||||
}
|
||||
};
|
||||
|
||||
struct AllowConstexprMembers {
|
||||
static constexpr RefCountedBase* mRefCounted = nullptr;
|
||||
MOZ_CAN_RUN_SCRIPT void foo() {
|
||||
mRefCounted->method_test();
|
||||
}
|
||||
MOZ_CAN_RUN_SCRIPT void bar() {
|
||||
test2(mRefCounted);
|
||||
}
|
||||
MOZ_CAN_RUN_SCRIPT void baz() {
|
||||
test_ref(*mRefCounted);
|
||||
}
|
||||
};
|
||||
|
||||
MOZ_CAN_RUN_SCRIPT void test_constexpr_1() {
|
||||
AllowConstexprMembers::mRefCounted->method_test();
|
||||
}
|
||||
|
||||
MOZ_CAN_RUN_SCRIPT void test_constexpr_2() {
|
||||
test2(AllowConstexprMembers::mRefCounted);
|
||||
}
|
||||
|
||||
MOZ_CAN_RUN_SCRIPT void test_constexpr_3() {
|
||||
test_ref(*AllowConstexprMembers::mRefCounted);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче