Skip to content

Commit 309ccf3

Browse files
author
Dave Bartolomeo
committed
C++: Factor out common code to avoid recursion
1 parent 772324f commit 309ccf3

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,26 @@ predicate hasTranslatedLoad(Expr expr) {
256256
not ignoreLoad(expr)
257257
}
258258

259+
/**
260+
* Holds if the specified `DeclarationEntry` needs an IR translation. An IR translation is only
261+
* necessary for automatic local variables, or for static local variables with dynamic
262+
* initialization.
263+
*/
264+
private predicate translateDeclarationEntry(DeclarationEntry entry) {
265+
exists(DeclStmt declStmt, LocalVariable var |
266+
translateStmt(declStmt) and
267+
declStmt.getADeclarationEntry() = entry and
268+
// Only declarations of local variables need to be translated to IR.
269+
var = entry.getDeclaration() and
270+
(
271+
not var.isStatic()
272+
or
273+
// Ignore static variables unless they have a dynamic initializer.
274+
var.(StaticLocalVariable).hasDynamicInitialization()
275+
)
276+
)
277+
}
278+
259279
newtype TTranslatedElement =
260280
// An expression that is not being consumed as a condition
261281
TTranslatedValueExpr(Expr expr) {
@@ -393,27 +413,12 @@ newtype TTranslatedElement =
393413
)
394414
} or
395415
// A local declaration
396-
TTranslatedDeclarationEntry(DeclarationEntry entry) {
397-
exists(DeclStmt declStmt, LocalVariable var |
398-
translateStmt(declStmt) and
399-
declStmt.getADeclarationEntry() = entry and
400-
// Only declarations of local variables need to be translated to IR.
401-
var = entry.getDeclaration() and
402-
(
403-
not var.isStatic()
404-
or
405-
// Ignore static variables unless they have a dynamic initializer.
406-
var.(StaticLocalVariable).hasDynamicInitialization()
407-
)
408-
)
409-
} or
416+
TTranslatedDeclarationEntry(DeclarationEntry entry) { translateDeclarationEntry(entry) } or
410417
// The dynamic initialization of a static local variable. This is a separate object from the
411418
// declaration entry.
412419
TTranslatedStaticLocalVariableInitialization(DeclarationEntry entry) {
413-
exists(TTranslatedDeclarationEntry translatedEntry |
414-
translatedEntry = TTranslatedDeclarationEntry(entry) and
415-
entry.getDeclaration() instanceof StaticLocalVariable
416-
)
420+
translateDeclarationEntry(entry) and
421+
entry.getDeclaration() instanceof StaticLocalVariable
417422
} or
418423
// A compiler-generated variable to implement a range-based for loop. These don't have a
419424
// `DeclarationEntry` in the database, so we have to go by the `Variable` itself.

0 commit comments

Comments
 (0)