From 164f248f0316a0e4905e6fe07c8f80481d5572e3 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Fri, 28 Aug 2026 18:47:58 +0100 Subject: [PATCH 1/3] fix: support base components in offsetof expressions --- .../clang/parsers/data/ClavaDataParsers.java | 4 ++ .../ast/expr/data/offsetof/OffsetOfBase.java | 38 +++++++++++++++++++ .../expr/data/offsetof/OffsetOfComponent.java | 2 + 3 files changed, 44 insertions(+) create mode 100644 ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java diff --git a/ClangAstParser/src/pt/up/fe/specs/clang/parsers/data/ClavaDataParsers.java b/ClangAstParser/src/pt/up/fe/specs/clang/parsers/data/ClavaDataParsers.java index 531c6feea..2e3c7c9ff 100644 --- a/ClangAstParser/src/pt/up/fe/specs/clang/parsers/data/ClavaDataParsers.java +++ b/ClangAstParser/src/pt/up/fe/specs/clang/parsers/data/ClavaDataParsers.java @@ -60,6 +60,7 @@ import pt.up.fe.specs.clava.ast.expr.data.designator.Designator; import pt.up.fe.specs.clava.ast.expr.data.designator.FieldDesignator; import pt.up.fe.specs.clava.ast.expr.data.offsetof.OffsetOfArray; +import pt.up.fe.specs.clava.ast.expr.data.offsetof.OffsetOfBase; import pt.up.fe.specs.clava.ast.expr.data.offsetof.OffsetOfComponent; import pt.up.fe.specs.clava.ast.expr.data.offsetof.OffsetOfComponentKind; import pt.up.fe.specs.clava.ast.expr.data.offsetof.OffsetOfField; @@ -459,6 +460,9 @@ public static OffsetOfComponent offsetOfComponent(LineStream lines, ClangAstData case IDENTIFIER: component.set(OffsetOfIdentifier.FIELD_NAME, lines.nextLine()); break; + case BASE: + parserData.getClavaNodes().queueSetNode(component, OffsetOfBase.TYPE, lines.nextLine()); + break; default: throw new NotImplementedException(kind); } diff --git a/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java b/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java new file mode 100644 index 000000000..4cf8c13bc --- /dev/null +++ b/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java @@ -0,0 +1,38 @@ +/** + * Copyright 2026 SPeCS. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package pt.up.fe.specs.clava.ast.expr.data.offsetof; + +import org.suikasoft.jOptions.Datakey.DataKey; +import org.suikasoft.jOptions.Datakey.KeyFactory; + +import pt.up.fe.specs.clava.ast.type.Type; + +public class OffsetOfBase extends OffsetOfComponent { + + /// DATAKEYS BEGIN + + public final static DataKey TYPE = KeyFactory.object("type", Type.class); + + /// DATAKEYS END + + @Override + public String getCode() { + return get(TYPE).getCode(); + } + + @Override + public OffsetOfComponentKind getKind() { + return OffsetOfComponentKind.BASE; + } +} diff --git a/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfComponent.java b/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfComponent.java index bfe9330d5..bcd2765a8 100644 --- a/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfComponent.java +++ b/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfComponent.java @@ -41,6 +41,8 @@ public static OffsetOfComponent newInstance(OffsetOfComponentKind kind) { return new OffsetOfField(); case IDENTIFIER: return new OffsetOfIdentifier(); + case BASE: + return new OffsetOfBase(); default: throw new NotImplementedException(kind); } From e8aa2c296b79a0e1fb2b596ffa2fb33b5f2d6a7a Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Fri, 28 Aug 2026 22:21:40 +0100 Subject: [PATCH 2/3] fix: omit semantic base from offsetof code --- .../up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java b/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java index 4cf8c13bc..b52ecf056 100644 --- a/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java +++ b/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/data/offsetof/OffsetOfBase.java @@ -28,7 +28,8 @@ public class OffsetOfBase extends OffsetOfComponent { @Override public String getCode() { - return get(TYPE).getCode(); + // Clang adds the base to the semantic path, but it is not part of the source designator. + return ""; } @Override From 660ff17cd57208b51e4b2a05a3e4a0bb3b68cc83 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Fri, 28 Aug 2026 22:23:02 +0100 Subject: [PATCH 3/3] fix: ignore empty offsetof components --- .../up/fe/specs/clava/ast/expr/OffsetOfExpr.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/OffsetOfExpr.java b/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/OffsetOfExpr.java index bf5ab5083..2ef7f313f 100644 --- a/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/OffsetOfExpr.java +++ b/ClavaAst/src/pt/up/fe/specs/clava/ast/expr/OffsetOfExpr.java @@ -50,18 +50,20 @@ private String getComponentsCode() { StringBuilder code = new StringBuilder(); - boolean isFirst = true; + boolean hasCode = false; for (OffsetOfComponent component : get(COMPONENTS)) { + String componentCode = component.getCode(); - if (component.isField() && !isFirst) { - code.append("."); + if (componentCode.isEmpty()) { + continue; } - code.append(component.getCode()); - - if (isFirst) { - isFirst = false; + if (component.isField() && hasCode) { + code.append("."); } + + code.append(componentCode); + hasCode = true; } return code.toString(); }