Skip to content

Commit fc78d55

Browse files
authored
[CLANG] Resolves crash on invalid loop vectorize_width (#169473)
Diagnose malformed '#pragma clang loop vectorize_width' lists. Avoids crash in HandlePragmaLoopHint, emit clear diagnostic and added regression test. Fixes #166325
1 parent dfed044 commit fc78d55

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,8 @@ Crash and bug fixes
783783
- Fixed a crash when compiling ``__real__`` or ``__imag__`` unary operator on scalar value with type promotion. (#GH160583)
784784
- Fixed a crash when parsing invalid nested name specifier sequences
785785
containing a single colon. (#GH167905)
786+
- Fixed a crash when parsing malformed #pragma clang loop vectorize_width(4,8,16)
787+
by diagnosing invalid comma-separated argument lists. (#GH166325)
786788

787789
Improvements
788790
^^^^^^^^^^^^

clang/lib/Parse/ParsePragma.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ bool Parser::HandlePragmaLoopHint(LoopHint &Hint) {
15311531
PP.Lex(Tok); // ,
15321532

15331533
StateInfo = Tok.getIdentifierInfo();
1534-
IsScalableStr = StateInfo->getName();
1534+
IsScalableStr = StateInfo ? StateInfo->getName() : "";
15351535

15361536
if (IsScalableStr != "scalable" && IsScalableStr != "fixed") {
15371537
Diag(Tok.getLocation(),
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: %clang_cc1 -fsyntax-only %s -verify
2+
3+
void sum_vector(unsigned int A[], unsigned int B[], unsigned int sum[]) {
4+
#pragma clang loop vectorize_width(4,8,16) vectorize(assume_safety)
5+
// expected-error@-1 {{vectorize_width loop hint malformed; use vectorize_width(X, fixed) or vectorize_width(X, scalable) where X is an integer, or vectorize_width('fixed' or 'scalable')}}
6+
// expected-warning@-2 {{extra tokens at end of '#pragma clang loop vectorize_width' - ignored}}
7+
8+
for (int k = 0; k < 64; k++) {
9+
sum[k] = A[k] + 3 * B[k];
10+
}
11+
}

0 commit comments

Comments
 (0)