3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-05-24 19:06:21 +00:00

Remove structured bindings refactoring from code conventions analyzer (#8428)

* Initial plan

* Remove structured bindings focus from code conventions analyzer

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

* Regenerate code-conventions-analyzer.lock.yml after removing structured bindings

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
Copilot 2026-01-29 18:56:55 -08:00 committed by Nikolaj Bjorner
parent 6d9b5e83b3
commit 3c34c5c4d7
2 changed files with 41 additions and 302 deletions

View file

@ -13,7 +13,7 @@
# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \
# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/
# #
# This file was automatically generated by gh-aw (v0.37.28). DO NOT EDIT. # This file was automatically generated by gh-aw (v0.37.32). DO NOT EDIT.
# #
# To update this file, edit the corresponding .md file and run: # To update this file, edit the corresponding .md file and run:
# gh aw compile # gh aw compile
@ -44,7 +44,7 @@ jobs:
comment_repo: "" comment_repo: ""
steps: steps:
- name: Setup Scripts - name: Setup Scripts
uses: githubnext/gh-aw/actions/setup@v0.37.28 uses: githubnext/gh-aw/actions/setup@v0.37.32
with: with:
destination: /opt/gh-aw/actions destination: /opt/gh-aw/actions
- name: Check workflow file timestamps - name: Check workflow file timestamps
@ -81,7 +81,7 @@ jobs:
secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }}
steps: steps:
- name: Setup Scripts - name: Setup Scripts
uses: githubnext/gh-aw/actions/setup@v0.37.28 uses: githubnext/gh-aw/actions/setup@v0.37.32
with: with:
destination: /opt/gh-aw/actions destination: /opt/gh-aw/actions
- name: Checkout repository - name: Checkout repository
@ -152,7 +152,7 @@ jobs:
mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/safeoutputs
mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs
cat > /opt/gh-aw/safeoutputs/config.json << 'EOF' cat > /opt/gh-aw/safeoutputs/config.json << 'EOF'
{"create_discussion":{"max":1},"create_issue":{"max":5},"create_missing_tool_issue":{"max":1,"title_prefix":"[missing tool]"},"missing_data":{},"missing_tool":{},"noop":{"max":1}} {"create_discussion":{"expires":168,"max":1},"create_issue":{"max":5},"create_missing_tool_issue":{"max":1,"title_prefix":"[missing tool]"},"missing_data":{},"missing_tool":{},"noop":{"max":1}}
EOF EOF
cat > /opt/gh-aw/safeoutputs/tools.json << 'EOF' cat > /opt/gh-aw/safeoutputs/tools.json << 'EOF'
[ [
@ -369,7 +369,6 @@ jobs:
"maxLength": 256 "maxLength": 256
}, },
"tool": { "tool": {
"required": true,
"type": "string", "type": "string",
"sanitize": true, "sanitize": true,
"maxLength": 128 "maxLength": 128
@ -492,7 +491,7 @@ jobs:
model: process.env.GH_AW_MODEL_AGENT_COPILOT || "", model: process.env.GH_AW_MODEL_AGENT_COPILOT || "",
version: "", version: "",
agent_version: "0.0.395", agent_version: "0.0.395",
cli_version: "v0.37.28", cli_version: "v0.37.32",
workflow_name: "Code Conventions Analyzer", workflow_name: "Code Conventions Analyzer",
experimental: false, experimental: false,
supports_tools_allowlist: true, supports_tools_allowlist: true,
@ -559,7 +558,7 @@ jobs:
<instructions> <instructions>
To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls. To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls.
**Available tools**: create_discussion, create_issue, missing_tool, noop Discover available tools from the safeoutputs MCP server.
**Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped. **Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped.
</instructions> </instructions>
@ -603,41 +602,9 @@ jobs:
## Your Task ## Your Task
**PRIMARY FOCUS: Create Issues for Tuple Pattern (Structured Bindings) Refactoring** **PRIMARY FOCUS: Create Issues for initializer_list Refactoring**
Your primary task is to identify and implement refactorings that use C++17 structured bindings instead of accessing `.first` and `.second`: Your primary task is to identify and implement refactorings that use `std::initializer_list<T>` instead of array pointer + size parameters:
1. **Find tuple/pair access patterns** - Code accessing `.first` and `.second` members
2. **Implement the refactoring** - Replace with structured bindings for clearer code
3. **Create issues** - Automatically create an issue with your changes for tuple pattern improvements
**Focus Areas for Tuple Pattern Refactoring:**
- Variables that access both `.first` and `.second` multiple times
- Return values from functions that are immediately decomposed
- Iterator dereferences accessing pair members (e.g., map iterators)
- Code that would be clearer with meaningful variable names instead of `.first`/`.second`
**Naming Convention for Structured Bindings:**
When introducing structured bindings, use names that are representative of the types or field semantics:
- For `enode_pair`: use `[n1, n2]` instead of `[first, second]` or `[a, b]`
- For map iterators: use `[key, value]` or `[k, v]` instead of `[first, second]`
- For domain-specific pairs: use names reflecting the semantics (e.g., `[var, offset]`, `[expr, count]`)
- **Avoid generic names** like `first`, `second`, `third`, `a`, `b` unless the pair truly represents generic values
**Example refactoring:**
```cpp
// Before: Using .first and .second on enode_pair
enode_pair p = get_pair(y);
return merge(p.first, p.second);
// After: Using structured bindings with meaningful names
auto [n1, n2] = get_pair(y);
return merge(n1, n2);
```
**SECONDARY FOCUS: Create Issues for initializer_list Refactoring**
Your secondary task is to identify and implement refactorings that use `std::initializer_list<T>` instead of array pointer + size parameters:
1. **Find array + size parameter patterns** - Functions taking `(unsigned sz, T* args)` or similar 1. **Find array + size parameter patterns** - Functions taking `(unsigned sz, T* args)` or similar
2. **Implement the refactoring** - Replace with `std::initializer_list<T>` for cleaner APIs 2. **Implement the refactoring** - Replace with `std::initializer_list<T>` for cleaner APIs
@ -677,7 +644,7 @@ jobs:
Additionally, conduct analysis of other coding conventions and modern C++ opportunities for discussion (not immediate implementation) Additionally, conduct analysis of other coding conventions and modern C++ opportunities for discussion (not immediate implementation)
## Workflow for initializer_list Refactoring (SECONDARY) ## Workflow for initializer_list Refactoring (PRIMARY)
### Step A: Find initializer_list Refactoring Opportunities ### Step A: Find initializer_list Refactoring Opportunities
@ -873,7 +840,6 @@ jobs:
- In-class member initializers - In-class member initializers
**C++17 features:** **C++17 features:**
- Structured bindings for tuple/pair unpacking
- `if constexpr` for compile-time conditionals - `if constexpr` for compile-time conditionals
- `std::string_view` for string parameters - `std::string_view` for string parameters
- Fold expressions for variadic templates - Fold expressions for variadic templates
@ -967,22 +933,6 @@ jobs:
- Incorrect usage of `std::move` (moving from const references, etc.) - Incorrect usage of `std::move` (moving from const references, etc.)
- Return value optimization opportunities being blocked - Return value optimization opportunities being blocked
**Tuple/Pair Access Patterns:**
- **PRIMARY TASK**: Code accessing `.first` and `.second` on pairs/tuples
- **ACTION**: Replace with C++17 structured bindings for cleaner, more readable code
- **RESULT**: Create an issue with the actual code changes
- **NAMING**: Use descriptive names based on types/semantics (e.g., `[n1, n2]` for `enode_pair`, `[k, v]` for maps)
- **Example**:
```cpp
// Before
enode_pair p = get_pair(y);
return merge(p.first, p.second);
// After: Use meaningful names, not generic [a, b]
auto [n1, n2] = get_pair(y);
return merge(n1, n2);
```
**Exception String Construction:** **Exception String Construction:**
- Using `stringstream` to build exception messages - Using `stringstream` to build exception messages
- Unnecessary string copies when raising exceptions - Unnecessary string copies when raising exceptions
@ -1019,8 +969,6 @@ jobs:
## Analysis Methodology ## Analysis Methodology
1. **Sample key directories** in the codebase: 1. **Sample key directories** in the codebase:
PROMPT_EOF
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
- `src/util/` - Core utilities and data structures - `src/util/` - Core utilities and data structures
- `src/ast/` - Abstract syntax tree implementations - `src/ast/` - Abstract syntax tree implementations
- `src/smt/` - SMT solver core - `src/smt/` - SMT solver core
@ -1066,13 +1014,15 @@ jobs:
### PRIMARY: Issues for Code Refactoring ### PRIMARY: Issues for Code Refactoring
When you implement refactorings (structured bindings, initializer_list), create issues using `output.create-issue` with: When you implement refactorings (initializer_list), create issues using `output.create-issue` with:
- Clear title indicating what was refactored - Clear title indicating what was refactored
- Description of changes and benefits - Description of changes and benefits
- List of modified files and functions - List of modified files and functions
### SECONDARY: Detailed Analysis Discussion ### SECONDARY: Detailed Analysis Discussion
PROMPT_EOF
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
For other code quality findings, create a comprehensive discussion with your findings structured as follows: For other code quality findings, create a comprehensive discussion with your findings structured as follows:
### Discussion Title ### Discussion Title
@ -1298,80 +1248,21 @@ jobs:
- **Incorrect std::move**: [Move from const, unnecessary moves] - **Incorrect std::move**: [Move from const, unnecessary moves]
- **Return Value Optimization**: [Places where RVO is blocked] - **Return Value Optimization**: [Places where RVO is blocked]
### 4.8 Tuple Pattern (Structured Bindings) Modernization - **IMPLEMENT AS ISSUE** ### 4.8 Exception String Construction
**This is the PRIMARY focus area - implement these changes directly:**
- **Current Pattern**: Accessing `.first` and `.second` on pairs/tuples
- **Modern Pattern**: Use C++17 structured bindings for cleaner code
- **Benefits**:
- More readable variable names instead of `.first`/`.second`
- Clearer intent of what values represent
- Eliminates intermediate variables
- Reduces chance of errors from swapping `.first`/`.second`
- **Action**: Find and refactor tuple/pair access patterns:
1. Search for patterns using `.first` and `.second`
2. Identify cases where intermediate variable can be eliminated
3. Refactor to use structured bindings with **meaningful names** (not generic `a`, `b`, `first`, `second`)
4. Create an issue with changes
- **Example Pattern**:
```cpp
// Before: Using .first and .second on enode_pair
enode_pair p = get_pair(y);
return merge(p.first, p.second);
// After: Using structured bindings with descriptive names
auto [n1, n2] = get_pair(y);
return merge(n1, n2);
```
- **Another Example**:
```cpp
// Before: Accessing pair members via iterator
auto result = map.find(key);
if (result != map.end()) {
use_key(result->first);
use_value(result->second);
}
// After: Structured bindings to access pair
auto it = map.find(key);
if (it != map.end()) {
auto& [k, v] = *it;
use_key(k);
use_value(v);
}
// Or for range-based loops (eliminates iterator entirely):
for (auto& [k, v] : map) {
use_key(k);
use_value(v);
}
```
- **Search Patterns**: Look for code using `.first` or `.second` on:
- Return values from functions returning `std::pair` or tuples
- Iterator dereferences (especially map iterators)
- Direct pair/tuple variable access
- **Candidates**: Functions or code blocks that:
- Call `.first` and `.second` on the same variable multiple times
- Create intermediate variables just to access pair members
- Have sequential uses of both `.first` and `.second`
- **Output**: Issue with refactored code
### 4.9 Exception String Construction
- **Current**: [stringstream usage for building exception messages] - **Current**: [stringstream usage for building exception messages]
- **Modern**: [std::format and std::formater opportunities] - **Modern**: [std::format and std::formater opportunities]
- **String Copies**: [Unnecessary copies when raising exceptions] - **String Copies**: [Unnecessary copies when raising exceptions]
- **Examples**: [Specific exception construction sites] - **Examples**: [Specific exception construction sites]
### 4.10 Array Parameter Modernization (std::span) ### 4.9 Array Parameter Modernization (std::span)
- **Current**: [Pointer + size parameter pairs for runtime-sized arrays] - **Current**: [Pointer + size parameter pairs for runtime-sized arrays]
- **Modern**: [std::span usage opportunities] - **Modern**: [std::span usage opportunities]
- **Type Safety**: [How span improves API safety] - **Type Safety**: [How span improves API safety]
- **Examples**: [Function signatures to update] - **Examples**: [Function signatures to update]
### 4.11 Array Parameter Modernization (std::initializer_list) - **IMPLEMENT AS ISSUE** ### 4.10 Array Parameter Modernization (std::initializer_list) - **IMPLEMENT AS ISSUE**
**This is a SECONDARY focus area - implement these changes directly:** **This is the PRIMARY focus area - implement these changes directly:**
- **Current Pattern**: Functions with `unsigned sz, T* args` or `unsigned sz, T* const* args` parameters - **Current Pattern**: Functions with `unsigned sz, T* args` or `unsigned sz, T* const* args` parameters
- **Modern Pattern**: Use `std::initializer_list<T>` for functions called with compile-time constant arrays - **Modern Pattern**: Use `std::initializer_list<T>` for functions called with compile-time constant arrays
@ -1421,20 +1312,18 @@ jobs:
- **Output**: Issue with refactored code - **Output**: Issue with refactored code
- **Note**: Only apply to internal C++ APIs, not to public C API functions that need C compatibility - **Note**: Only apply to internal C++ APIs, not to public C API functions that need C compatibility
### 4.12 Increment Operator Patterns ### 4.11 Increment Operator Patterns
- **Postfix Usage**: [Count of i++ where result is unused] - **Postfix Usage**: [Count of i++ where result is unused]
- **Prefix Preference**: [Places to use ++i instead] - **Prefix Preference**: [Places to use ++i instead]
PROMPT_EOF
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
- **Iterator Loops**: [Heavy iterator usage areas] - **Iterator Loops**: [Heavy iterator usage areas]
### 4.13 Exception Control Flow ### 4.12 Exception Control Flow
- **Current Usage**: [Exceptions used for normal control flow] - **Current Usage**: [Exceptions used for normal control flow]
- **Modern Alternatives**: [std::expected or error codes] - **Modern Alternatives**: [std::expected or error codes]
- **Performance**: [Impact of exception-based control flow] - **Performance**: [Impact of exception-based control flow]
- **Refactoring Opportunities**: [Specific patterns to replace] - **Refactoring Opportunities**: [Specific patterns to replace]
### 4.14 Inefficient Stream Output ### 4.13 Inefficient Stream Output
- **Current Usage**: [string stream output operator used for single characters] - **Current Usage**: [string stream output operator used for single characters]
- **Modern Alternatives**: [use char output operator] - **Modern Alternatives**: [use char output operator]
- **Performance**: [Reduce code size and improve performance] - **Performance**: [Reduce code size and improve performance]
@ -1545,6 +1434,8 @@ jobs:
- **Be constructive**: Frame findings as opportunities, not criticisms - **Be constructive**: Frame findings as opportunities, not criticisms
- **Quantify when possible**: Use numbers to show prevalence of patterns - **Quantify when possible**: Use numbers to show prevalence of patterns
- **Consider backward compatibility**: Z3 is a mature project with many users - **Consider backward compatibility**: Z3 is a mature project with many users
PROMPT_EOF
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
- **Measure size improvements**: Use `static_assert` and `sizeof` to verify memory layout optimizations - **Measure size improvements**: Use `static_assert` and `sizeof` to verify memory layout optimizations
- **Prioritize safety**: Smart pointers and `std::span` improve type safety - **Prioritize safety**: Smart pointers and `std::span` improve type safety
- **Consider performance**: Hash table optimizations and AST caching have measurable impact - **Consider performance**: Hash table optimizations and AST caching have measurable impact
@ -1670,28 +1561,6 @@ jobs:
grep pattern: "bool.*\(.*\*.*\)|bool.*\(.*&" glob: "src/**/*.h" grep pattern: "bool.*\(.*\*.*\)|bool.*\(.*&" glob: "src/**/*.h"
``` ```
**Find tuple/pair access patterns (structured binding opportunities):**
```
# Find .first usage
grep pattern: "\.first" glob: "src/**/*.{cpp,h}"
# Find .second usage
grep pattern: "\.second" glob: "src/**/*.{cpp,h}"
# Find same variable used with both .first and .second on same line (high-value candidates)
# Note: This only matches single-line patterns where the same var is used; use separate .first/.second searches for comprehensive coverage
grep pattern: "([a-z_]+)\.first.*\1\.second" glob: "src/**/*.cpp"
# Find iterator dereferencing with .first or .second
grep pattern: "->first|->second" glob: "src/**/*.cpp"
# Find return statements using .first and .second
grep pattern: "return.*\.first.*\.second" glob: "src/**/*.cpp"
# Find function calls with .first and .second as arguments (focused pattern)
grep pattern: "\([^)]*\.first[^)]*\.second[^)]*\)" glob: "src/**/*.cpp"
```
**Find pointer + size parameters:** **Find pointer + size parameters:**
``` ```
grep pattern: "\([^,]+\*[^,]*,\s*size_t|, unsigned.*size\)" glob: "src/**/*.h" grep pattern: "\([^,]+\*[^,]*,\s*size_t|, unsigned.*size\)" glob: "src/**/*.h"
@ -1739,7 +1608,7 @@ jobs:
- Never execute untrusted code - Never execute untrusted code
- Use `bash` only for safe operations (git, grep patterns) - Use `bash` only for safe operations (git, grep patterns)
- **For code refactoring (structured bindings, initializer_list)**: Use the `edit` tool to modify files directly - **For code refactoring (initializer_list)**: Use the `edit` tool to modify files directly
- **For other findings**: Create discussions only (no code modifications) - **For other findings**: Create discussions only (no code modifications)
- All code changes will be reviewed through the issue process - All code changes will be reviewed through the issue process
@ -1747,7 +1616,7 @@ jobs:
**Two types of outputs:** **Two types of outputs:**
1. **Issue** (for refactorings like structured bindings or initializer_list): 1. **Issue** (for refactorings like initializer_list):
- Use `output.create-issue` to create an issue - Use `output.create-issue` to create an issue
- Include clear title and description - Include clear title and description
- List all modified files - List all modified files
@ -1839,7 +1708,7 @@ jobs:
run: | run: |
set -o pipefail set -o pipefail
GH_AW_TOOL_BINS=""; [ -n "$GOROOT" ] && GH_AW_TOOL_BINS="$GOROOT/bin:$GH_AW_TOOL_BINS"; [ -n "$JAVA_HOME" ] && GH_AW_TOOL_BINS="$JAVA_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$CARGO_HOME" ] && GH_AW_TOOL_BINS="$CARGO_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$GEM_HOME" ] && GH_AW_TOOL_BINS="$GEM_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$CONDA" ] && GH_AW_TOOL_BINS="$CONDA/bin:$GH_AW_TOOL_BINS"; [ -n "$PIPX_BIN_DIR" ] && GH_AW_TOOL_BINS="$PIPX_BIN_DIR:$GH_AW_TOOL_BINS"; [ -n "$SWIFT_PATH" ] && GH_AW_TOOL_BINS="$SWIFT_PATH:$GH_AW_TOOL_BINS"; [ -n "$DOTNET_ROOT" ] && GH_AW_TOOL_BINS="$DOTNET_ROOT:$GH_AW_TOOL_BINS"; export GH_AW_TOOL_BINS GH_AW_TOOL_BINS=""; [ -n "$GOROOT" ] && GH_AW_TOOL_BINS="$GOROOT/bin:$GH_AW_TOOL_BINS"; [ -n "$JAVA_HOME" ] && GH_AW_TOOL_BINS="$JAVA_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$CARGO_HOME" ] && GH_AW_TOOL_BINS="$CARGO_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$GEM_HOME" ] && GH_AW_TOOL_BINS="$GEM_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$CONDA" ] && GH_AW_TOOL_BINS="$CONDA/bin:$GH_AW_TOOL_BINS"; [ -n "$PIPX_BIN_DIR" ] && GH_AW_TOOL_BINS="$PIPX_BIN_DIR:$GH_AW_TOOL_BINS"; [ -n "$SWIFT_PATH" ] && GH_AW_TOOL_BINS="$SWIFT_PATH:$GH_AW_TOOL_BINS"; [ -n "$DOTNET_ROOT" ] && GH_AW_TOOL_BINS="$DOTNET_ROOT:$GH_AW_TOOL_BINS"; export GH_AW_TOOL_BINS
sudo -E awf --env-all --env 'ANDROID_HOME=${ANDROID_HOME}' --env 'ANDROID_NDK=${ANDROID_NDK}' --env 'ANDROID_NDK_HOME=${ANDROID_NDK_HOME}' --env 'ANDROID_NDK_LATEST_HOME=${ANDROID_NDK_LATEST_HOME}' --env 'ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT}' --env 'ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}' --env 'AZURE_EXTENSION_DIR=${AZURE_EXTENSION_DIR}' --env 'CARGO_HOME=${CARGO_HOME}' --env 'CHROMEWEBDRIVER=${CHROMEWEBDRIVER}' --env 'CONDA=${CONDA}' --env 'DOTNET_ROOT=${DOTNET_ROOT}' --env 'EDGEWEBDRIVER=${EDGEWEBDRIVER}' --env 'GECKOWEBDRIVER=${GECKOWEBDRIVER}' --env 'GEM_HOME=${GEM_HOME}' --env 'GEM_PATH=${GEM_PATH}' --env 'GOPATH=${GOPATH}' --env 'GOROOT=${GOROOT}' --env 'HOMEBREW_CELLAR=${HOMEBREW_CELLAR}' --env 'HOMEBREW_PREFIX=${HOMEBREW_PREFIX}' --env 'HOMEBREW_REPOSITORY=${HOMEBREW_REPOSITORY}' --env 'JAVA_HOME=${JAVA_HOME}' --env 'JAVA_HOME_11_X64=${JAVA_HOME_11_X64}' --env 'JAVA_HOME_17_X64=${JAVA_HOME_17_X64}' --env 'JAVA_HOME_21_X64=${JAVA_HOME_21_X64}' --env 'JAVA_HOME_25_X64=${JAVA_HOME_25_X64}' --env 'JAVA_HOME_8_X64=${JAVA_HOME_8_X64}' --env 'NVM_DIR=${NVM_DIR}' --env 'PIPX_BIN_DIR=${PIPX_BIN_DIR}' --env 'PIPX_HOME=${PIPX_HOME}' --env 'RUSTUP_HOME=${RUSTUP_HOME}' --env 'SELENIUM_JAR_PATH=${SELENIUM_JAR_PATH}' --env 'SWIFT_PATH=${SWIFT_PATH}' --env 'VCPKG_INSTALLATION_ROOT=${VCPKG_INSTALLATION_ROOT}' --env 'GH_AW_TOOL_BINS=$GH_AW_TOOL_BINS' --container-workdir "${GITHUB_WORKSPACE}" --mount /tmp:/tmp:rw --mount "${GITHUB_WORKSPACE}:${GITHUB_WORKSPACE}:rw" --mount /usr/bin/date:/usr/bin/date:ro --mount /usr/bin/gh:/usr/bin/gh:ro --mount /usr/bin/yq:/usr/bin/yq:ro --mount /usr/local/bin/copilot:/usr/local/bin/copilot:ro --mount /home/runner/.copilot:/home/runner/.copilot:rw --mount /opt/hostedtoolcache:/opt/hostedtoolcache:ro --mount /opt/gh-aw:/opt/gh-aw:ro --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.11.2 --agent-image act \ sudo -E awf --env-all --env 'ANDROID_HOME=${ANDROID_HOME}' --env 'ANDROID_NDK=${ANDROID_NDK}' --env 'ANDROID_NDK_HOME=${ANDROID_NDK_HOME}' --env 'ANDROID_NDK_LATEST_HOME=${ANDROID_NDK_LATEST_HOME}' --env 'ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT}' --env 'ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}' --env 'AZURE_EXTENSION_DIR=${AZURE_EXTENSION_DIR}' --env 'CARGO_HOME=${CARGO_HOME}' --env 'CHROMEWEBDRIVER=${CHROMEWEBDRIVER}' --env 'CONDA=${CONDA}' --env 'DOTNET_ROOT=${DOTNET_ROOT}' --env 'EDGEWEBDRIVER=${EDGEWEBDRIVER}' --env 'GECKOWEBDRIVER=${GECKOWEBDRIVER}' --env 'GEM_HOME=${GEM_HOME}' --env 'GEM_PATH=${GEM_PATH}' --env 'GOPATH=${GOPATH}' --env 'GOROOT=${GOROOT}' --env 'HOMEBREW_CELLAR=${HOMEBREW_CELLAR}' --env 'HOMEBREW_PREFIX=${HOMEBREW_PREFIX}' --env 'HOMEBREW_REPOSITORY=${HOMEBREW_REPOSITORY}' --env 'JAVA_HOME=${JAVA_HOME}' --env 'JAVA_HOME_11_X64=${JAVA_HOME_11_X64}' --env 'JAVA_HOME_17_X64=${JAVA_HOME_17_X64}' --env 'JAVA_HOME_21_X64=${JAVA_HOME_21_X64}' --env 'JAVA_HOME_25_X64=${JAVA_HOME_25_X64}' --env 'JAVA_HOME_8_X64=${JAVA_HOME_8_X64}' --env 'NVM_DIR=${NVM_DIR}' --env 'PIPX_BIN_DIR=${PIPX_BIN_DIR}' --env 'PIPX_HOME=${PIPX_HOME}' --env 'RUSTUP_HOME=${RUSTUP_HOME}' --env 'SELENIUM_JAR_PATH=${SELENIUM_JAR_PATH}' --env 'SWIFT_PATH=${SWIFT_PATH}' --env 'VCPKG_INSTALLATION_ROOT=${VCPKG_INSTALLATION_ROOT}' --env 'GH_AW_TOOL_BINS=$GH_AW_TOOL_BINS' --container-workdir "${GITHUB_WORKSPACE}" --mount /tmp:/tmp:rw --mount "${GITHUB_WORKSPACE}:${GITHUB_WORKSPACE}:rw" --mount /usr/bin/cat:/usr/bin/cat:ro --mount /usr/bin/curl:/usr/bin/curl:ro --mount /usr/bin/date:/usr/bin/date:ro --mount /usr/bin/find:/usr/bin/find:ro --mount /usr/bin/gh:/usr/bin/gh:ro --mount /usr/bin/grep:/usr/bin/grep:ro --mount /usr/bin/jq:/usr/bin/jq:ro --mount /usr/bin/yq:/usr/bin/yq:ro --mount /usr/bin/cp:/usr/bin/cp:ro --mount /usr/bin/cut:/usr/bin/cut:ro --mount /usr/bin/diff:/usr/bin/diff:ro --mount /usr/bin/head:/usr/bin/head:ro --mount /usr/bin/ls:/usr/bin/ls:ro --mount /usr/bin/mkdir:/usr/bin/mkdir:ro --mount /usr/bin/rm:/usr/bin/rm:ro --mount /usr/bin/sed:/usr/bin/sed:ro --mount /usr/bin/sort:/usr/bin/sort:ro --mount /usr/bin/tail:/usr/bin/tail:ro --mount /usr/bin/wc:/usr/bin/wc:ro --mount /usr/bin/which:/usr/bin/which:ro --mount /usr/local/bin/copilot:/usr/local/bin/copilot:ro --mount /home/runner/.copilot:/home/runner/.copilot:rw --mount /opt/hostedtoolcache:/opt/hostedtoolcache:ro --mount /opt/gh-aw:/opt/gh-aw:ro --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.11.2 --agent-image act \
-- 'export PATH="$GH_AW_TOOL_BINS$(find /opt/hostedtoolcache -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH" && /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --add-dir "${GITHUB_WORKSPACE}" --disable-builtin-mcps --allow-tool github --allow-tool safeoutputs --allow-tool '\''shell(cat)'\'' --allow-tool '\''shell(clang-format --version)'\'' --allow-tool '\''shell(date)'\'' --allow-tool '\''shell(echo)'\'' --allow-tool '\''shell(git diff:*)'\'' --allow-tool '\''shell(git log:*)'\'' --allow-tool '\''shell(git show:*)'\'' --allow-tool '\''shell(grep)'\'' --allow-tool '\''shell(head)'\'' --allow-tool '\''shell(ls)'\'' --allow-tool '\''shell(pwd)'\'' --allow-tool '\''shell(sort)'\'' --allow-tool '\''shell(tail)'\'' --allow-tool '\''shell(uniq)'\'' --allow-tool '\''shell(wc)'\'' --allow-tool '\''shell(yq)'\'' --allow-tool write --add-dir /tmp/gh-aw/cache-memory/ --allow-all-paths --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_COPILOT:+ --model "$GH_AW_MODEL_AGENT_COPILOT"}' \ -- 'export PATH="$GH_AW_TOOL_BINS$(find /opt/hostedtoolcache -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH" && /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --add-dir "${GITHUB_WORKSPACE}" --disable-builtin-mcps --allow-tool github --allow-tool safeoutputs --allow-tool '\''shell(cat)'\'' --allow-tool '\''shell(clang-format --version)'\'' --allow-tool '\''shell(date)'\'' --allow-tool '\''shell(echo)'\'' --allow-tool '\''shell(git diff:*)'\'' --allow-tool '\''shell(git log:*)'\'' --allow-tool '\''shell(git show:*)'\'' --allow-tool '\''shell(grep)'\'' --allow-tool '\''shell(head)'\'' --allow-tool '\''shell(ls)'\'' --allow-tool '\''shell(pwd)'\'' --allow-tool '\''shell(sort)'\'' --allow-tool '\''shell(tail)'\'' --allow-tool '\''shell(uniq)'\'' --allow-tool '\''shell(wc)'\'' --allow-tool '\''shell(yq)'\'' --allow-tool write --add-dir /tmp/gh-aw/cache-memory/ --allow-all-paths --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_COPILOT:+ --model "$GH_AW_MODEL_AGENT_COPILOT"}' \
2>&1 | tee /tmp/gh-aw/agent-stdio.log 2>&1 | tee /tmp/gh-aw/agent-stdio.log
env: env:
@ -2001,7 +1870,7 @@ jobs:
total_count: ${{ steps.missing_tool.outputs.total_count }} total_count: ${{ steps.missing_tool.outputs.total_count }}
steps: steps:
- name: Setup Scripts - name: Setup Scripts
uses: githubnext/gh-aw/actions/setup@v0.37.28 uses: githubnext/gh-aw/actions/setup@v0.37.32
with: with:
destination: /opt/gh-aw/actions destination: /opt/gh-aw/actions
- name: Debug job inputs - name: Debug job inputs
@ -2102,7 +1971,7 @@ jobs:
success: ${{ steps.parse_results.outputs.success }} success: ${{ steps.parse_results.outputs.success }}
steps: steps:
- name: Setup Scripts - name: Setup Scripts
uses: githubnext/gh-aw/actions/setup@v0.37.28 uses: githubnext/gh-aw/actions/setup@v0.37.32
with: with:
destination: /opt/gh-aw/actions destination: /opt/gh-aw/actions
- name: Download agent artifacts - name: Download agent artifacts
@ -2253,7 +2122,7 @@ jobs:
process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }}
steps: steps:
- name: Setup Scripts - name: Setup Scripts
uses: githubnext/gh-aw/actions/setup@v0.37.28 uses: githubnext/gh-aw/actions/setup@v0.37.32
with: with:
destination: /opt/gh-aw/actions destination: /opt/gh-aw/actions
- name: Download agent output artifact - name: Download agent output artifact
@ -2290,7 +2159,7 @@ jobs:
permissions: {} permissions: {}
steps: steps:
- name: Setup Scripts - name: Setup Scripts
uses: githubnext/gh-aw/actions/setup@v0.37.28 uses: githubnext/gh-aw/actions/setup@v0.37.32
with: with:
destination: /opt/gh-aw/actions destination: /opt/gh-aw/actions
- name: Download cache-memory artifact (default) - name: Download cache-memory artifact (default)

View file

@ -38,41 +38,9 @@ You are an expert C++ code quality analyst specializing in the Z3 theorem prover
## Your Task ## Your Task
**PRIMARY FOCUS: Create Issues for Tuple Pattern (Structured Bindings) Refactoring** **PRIMARY FOCUS: Create Issues for initializer_list Refactoring**
Your primary task is to identify and implement refactorings that use C++17 structured bindings instead of accessing `.first` and `.second`: Your primary task is to identify and implement refactorings that use `std::initializer_list<T>` instead of array pointer + size parameters:
1. **Find tuple/pair access patterns** - Code accessing `.first` and `.second` members
2. **Implement the refactoring** - Replace with structured bindings for clearer code
3. **Create issues** - Automatically create an issue with your changes for tuple pattern improvements
**Focus Areas for Tuple Pattern Refactoring:**
- Variables that access both `.first` and `.second` multiple times
- Return values from functions that are immediately decomposed
- Iterator dereferences accessing pair members (e.g., map iterators)
- Code that would be clearer with meaningful variable names instead of `.first`/`.second`
**Naming Convention for Structured Bindings:**
When introducing structured bindings, use names that are representative of the types or field semantics:
- For `enode_pair`: use `[n1, n2]` instead of `[first, second]` or `[a, b]`
- For map iterators: use `[key, value]` or `[k, v]` instead of `[first, second]`
- For domain-specific pairs: use names reflecting the semantics (e.g., `[var, offset]`, `[expr, count]`)
- **Avoid generic names** like `first`, `second`, `third`, `a`, `b` unless the pair truly represents generic values
**Example refactoring:**
```cpp
// Before: Using .first and .second on enode_pair
enode_pair p = get_pair(y);
return merge(p.first, p.second);
// After: Using structured bindings with meaningful names
auto [n1, n2] = get_pair(y);
return merge(n1, n2);
```
**SECONDARY FOCUS: Create Issues for initializer_list Refactoring**
Your secondary task is to identify and implement refactorings that use `std::initializer_list<T>` instead of array pointer + size parameters:
1. **Find array + size parameter patterns** - Functions taking `(unsigned sz, T* args)` or similar 1. **Find array + size parameter patterns** - Functions taking `(unsigned sz, T* args)` or similar
2. **Implement the refactoring** - Replace with `std::initializer_list<T>` for cleaner APIs 2. **Implement the refactoring** - Replace with `std::initializer_list<T>` for cleaner APIs
@ -112,7 +80,7 @@ foo({1, 2});
Additionally, conduct analysis of other coding conventions and modern C++ opportunities for discussion (not immediate implementation) Additionally, conduct analysis of other coding conventions and modern C++ opportunities for discussion (not immediate implementation)
## Workflow for initializer_list Refactoring (SECONDARY) ## Workflow for initializer_list Refactoring (PRIMARY)
### Step A: Find initializer_list Refactoring Opportunities ### Step A: Find initializer_list Refactoring Opportunities
@ -308,7 +276,6 @@ Z3 uses C++20 (as specified in `.clang-format`). Look for opportunities to use:
- In-class member initializers - In-class member initializers
**C++17 features:** **C++17 features:**
- Structured bindings for tuple/pair unpacking
- `if constexpr` for compile-time conditionals - `if constexpr` for compile-time conditionals
- `std::string_view` for string parameters - `std::string_view` for string parameters
- Fold expressions for variadic templates - Fold expressions for variadic templates
@ -402,22 +369,6 @@ Identify opportunities specific to Z3's architecture and coding patterns:
- Incorrect usage of `std::move` (moving from const references, etc.) - Incorrect usage of `std::move` (moving from const references, etc.)
- Return value optimization opportunities being blocked - Return value optimization opportunities being blocked
**Tuple/Pair Access Patterns:**
- **PRIMARY TASK**: Code accessing `.first` and `.second` on pairs/tuples
- **ACTION**: Replace with C++17 structured bindings for cleaner, more readable code
- **RESULT**: Create an issue with the actual code changes
- **NAMING**: Use descriptive names based on types/semantics (e.g., `[n1, n2]` for `enode_pair`, `[k, v]` for maps)
- **Example**:
```cpp
// Before
enode_pair p = get_pair(y);
return merge(p.first, p.second);
// After: Use meaningful names, not generic [a, b]
auto [n1, n2] = get_pair(y);
return merge(n1, n2);
```
**Exception String Construction:** **Exception String Construction:**
- Using `stringstream` to build exception messages - Using `stringstream` to build exception messages
- Unnecessary string copies when raising exceptions - Unnecessary string copies when raising exceptions
@ -499,7 +450,7 @@ Identify opportunities specific to Z3's architecture and coding patterns:
### PRIMARY: Issues for Code Refactoring ### PRIMARY: Issues for Code Refactoring
When you implement refactorings (structured bindings, initializer_list), create issues using `output.create-issue` with: When you implement refactorings (initializer_list), create issues using `output.create-issue` with:
- Clear title indicating what was refactored - Clear title indicating what was refactored
- Description of changes and benefits - Description of changes and benefits
- List of modified files and functions - List of modified files and functions
@ -731,80 +682,21 @@ For each opportunity, provide:
- **Incorrect std::move**: [Move from const, unnecessary moves] - **Incorrect std::move**: [Move from const, unnecessary moves]
- **Return Value Optimization**: [Places where RVO is blocked] - **Return Value Optimization**: [Places where RVO is blocked]
### 4.8 Tuple Pattern (Structured Bindings) Modernization - **IMPLEMENT AS ISSUE** ### 4.8 Exception String Construction
**This is the PRIMARY focus area - implement these changes directly:**
- **Current Pattern**: Accessing `.first` and `.second` on pairs/tuples
- **Modern Pattern**: Use C++17 structured bindings for cleaner code
- **Benefits**:
- More readable variable names instead of `.first`/`.second`
- Clearer intent of what values represent
- Eliminates intermediate variables
- Reduces chance of errors from swapping `.first`/`.second`
- **Action**: Find and refactor tuple/pair access patterns:
1. Search for patterns using `.first` and `.second`
2. Identify cases where intermediate variable can be eliminated
3. Refactor to use structured bindings with **meaningful names** (not generic `a`, `b`, `first`, `second`)
4. Create an issue with changes
- **Example Pattern**:
```cpp
// Before: Using .first and .second on enode_pair
enode_pair p = get_pair(y);
return merge(p.first, p.second);
// After: Using structured bindings with descriptive names
auto [n1, n2] = get_pair(y);
return merge(n1, n2);
```
- **Another Example**:
```cpp
// Before: Accessing pair members via iterator
auto result = map.find(key);
if (result != map.end()) {
use_key(result->first);
use_value(result->second);
}
// After: Structured bindings to access pair
auto it = map.find(key);
if (it != map.end()) {
auto& [k, v] = *it;
use_key(k);
use_value(v);
}
// Or for range-based loops (eliminates iterator entirely):
for (auto& [k, v] : map) {
use_key(k);
use_value(v);
}
```
- **Search Patterns**: Look for code using `.first` or `.second` on:
- Return values from functions returning `std::pair` or tuples
- Iterator dereferences (especially map iterators)
- Direct pair/tuple variable access
- **Candidates**: Functions or code blocks that:
- Call `.first` and `.second` on the same variable multiple times
- Create intermediate variables just to access pair members
- Have sequential uses of both `.first` and `.second`
- **Output**: Issue with refactored code
### 4.9 Exception String Construction
- **Current**: [stringstream usage for building exception messages] - **Current**: [stringstream usage for building exception messages]
- **Modern**: [std::format and std::formater opportunities] - **Modern**: [std::format and std::formater opportunities]
- **String Copies**: [Unnecessary copies when raising exceptions] - **String Copies**: [Unnecessary copies when raising exceptions]
- **Examples**: [Specific exception construction sites] - **Examples**: [Specific exception construction sites]
### 4.10 Array Parameter Modernization (std::span) ### 4.9 Array Parameter Modernization (std::span)
- **Current**: [Pointer + size parameter pairs for runtime-sized arrays] - **Current**: [Pointer + size parameter pairs for runtime-sized arrays]
- **Modern**: [std::span usage opportunities] - **Modern**: [std::span usage opportunities]
- **Type Safety**: [How span improves API safety] - **Type Safety**: [How span improves API safety]
- **Examples**: [Function signatures to update] - **Examples**: [Function signatures to update]
### 4.11 Array Parameter Modernization (std::initializer_list) - **IMPLEMENT AS ISSUE** ### 4.10 Array Parameter Modernization (std::initializer_list) - **IMPLEMENT AS ISSUE**
**This is a SECONDARY focus area - implement these changes directly:** **This is the PRIMARY focus area - implement these changes directly:**
- **Current Pattern**: Functions with `unsigned sz, T* args` or `unsigned sz, T* const* args` parameters - **Current Pattern**: Functions with `unsigned sz, T* args` or `unsigned sz, T* const* args` parameters
- **Modern Pattern**: Use `std::initializer_list<T>` for functions called with compile-time constant arrays - **Modern Pattern**: Use `std::initializer_list<T>` for functions called with compile-time constant arrays
@ -854,18 +746,18 @@ For each opportunity, provide:
- **Output**: Issue with refactored code - **Output**: Issue with refactored code
- **Note**: Only apply to internal C++ APIs, not to public C API functions that need C compatibility - **Note**: Only apply to internal C++ APIs, not to public C API functions that need C compatibility
### 4.12 Increment Operator Patterns ### 4.11 Increment Operator Patterns
- **Postfix Usage**: [Count of i++ where result is unused] - **Postfix Usage**: [Count of i++ where result is unused]
- **Prefix Preference**: [Places to use ++i instead] - **Prefix Preference**: [Places to use ++i instead]
- **Iterator Loops**: [Heavy iterator usage areas] - **Iterator Loops**: [Heavy iterator usage areas]
### 4.13 Exception Control Flow ### 4.12 Exception Control Flow
- **Current Usage**: [Exceptions used for normal control flow] - **Current Usage**: [Exceptions used for normal control flow]
- **Modern Alternatives**: [std::expected or error codes] - **Modern Alternatives**: [std::expected or error codes]
- **Performance**: [Impact of exception-based control flow] - **Performance**: [Impact of exception-based control flow]
- **Refactoring Opportunities**: [Specific patterns to replace] - **Refactoring Opportunities**: [Specific patterns to replace]
### 4.14 Inefficient Stream Output ### 4.13 Inefficient Stream Output
- **Current Usage**: [string stream output operator used for single characters] - **Current Usage**: [string stream output operator used for single characters]
- **Modern Alternatives**: [use char output operator] - **Modern Alternatives**: [use char output operator]
- **Performance**: [Reduce code size and improve performance] - **Performance**: [Reduce code size and improve performance]
@ -1101,28 +993,6 @@ grep pattern: "return.*nullptr.*&" glob: "src/**/*.{h,cpp}"
grep pattern: "bool.*\(.*\*.*\)|bool.*\(.*&" glob: "src/**/*.h" grep pattern: "bool.*\(.*\*.*\)|bool.*\(.*&" glob: "src/**/*.h"
``` ```
**Find tuple/pair access patterns (structured binding opportunities):**
```
# Find .first usage
grep pattern: "\.first" glob: "src/**/*.{cpp,h}"
# Find .second usage
grep pattern: "\.second" glob: "src/**/*.{cpp,h}"
# Find same variable used with both .first and .second on same line (high-value candidates)
# Note: This only matches single-line patterns where the same var is used; use separate .first/.second searches for comprehensive coverage
grep pattern: "([a-z_]+)\.first.*\1\.second" glob: "src/**/*.cpp"
# Find iterator dereferencing with .first or .second
grep pattern: "->first|->second" glob: "src/**/*.cpp"
# Find return statements using .first and .second
grep pattern: "return.*\.first.*\.second" glob: "src/**/*.cpp"
# Find function calls with .first and .second as arguments (focused pattern)
grep pattern: "\([^)]*\.first[^)]*\.second[^)]*\)" glob: "src/**/*.cpp"
```
**Find pointer + size parameters:** **Find pointer + size parameters:**
``` ```
grep pattern: "\([^,]+\*[^,]*,\s*size_t|, unsigned.*size\)" glob: "src/**/*.h" grep pattern: "\([^,]+\*[^,]*,\s*size_t|, unsigned.*size\)" glob: "src/**/*.h"
@ -1170,7 +1040,7 @@ grep pattern: "<<\s*\".*\"\s*<<\s*\".*\"" glob: "src/**/*.cpp"
- Never execute untrusted code - Never execute untrusted code
- Use `bash` only for safe operations (git, grep patterns) - Use `bash` only for safe operations (git, grep patterns)
- **For code refactoring (structured bindings, initializer_list)**: Use the `edit` tool to modify files directly - **For code refactoring (initializer_list)**: Use the `edit` tool to modify files directly
- **For other findings**: Create discussions only (no code modifications) - **For other findings**: Create discussions only (no code modifications)
- All code changes will be reviewed through the issue process - All code changes will be reviewed through the issue process
@ -1178,7 +1048,7 @@ grep pattern: "<<\s*\".*\"\s*<<\s*\".*\"" glob: "src/**/*.cpp"
**Two types of outputs:** **Two types of outputs:**
1. **Issue** (for refactorings like structured bindings or initializer_list): 1. **Issue** (for refactorings like initializer_list):
- Use `output.create-issue` to create an issue - Use `output.create-issue` to create an issue
- Include clear title and description - Include clear title and description
- List all modified files - List all modified files