diff --git a/openmp/runtime/src/kmp_settings.cpp b/openmp/runtime/src/kmp_settings.cpp --- a/openmp/runtime/src/kmp_settings.cpp +++ b/openmp/runtime/src/kmp_settings.cpp @@ -2535,6 +2535,11 @@ signed := - signed -----------------------------------------------------------------------------*/ +// Warning to issue for syntax error during parsing of OMP_PLACES +static inline void __kmp_omp_places_syntax_warn(const char *var) { + KMP_WARNING(SyntaxErrorUsing, var, "\"cores\""); +} + static int __kmp_parse_subplace_list(const char *var, const char **scan) { const char *next; @@ -2546,7 +2551,7 @@ // SKIP_WS(*scan); if ((**scan < '0') || (**scan > '9')) { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } next = *scan; @@ -2565,7 +2570,7 @@ continue; } if (**scan != ':') { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } (*scan)++; // skip ':' @@ -2573,7 +2578,7 @@ // Read count parameter SKIP_WS(*scan); if ((**scan < '0') || (**scan > '9')) { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } next = *scan; @@ -2592,7 +2597,7 @@ continue; } if (**scan != ':') { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } (*scan)++; // skip ':' @@ -2614,7 +2619,7 @@ } SKIP_WS(*scan); if ((**scan < '0') || (**scan > '9')) { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } next = *scan; @@ -2634,7 +2639,7 @@ continue; } - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } return TRUE; @@ -2651,7 +2656,7 @@ return FALSE; } if (**scan != '}') { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } (*scan)++; // skip '}' @@ -2665,7 +2670,7 @@ KMP_ASSERT(proc >= 0); *scan = next; } else { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } return TRUE; @@ -2693,7 +2698,7 @@ continue; } if (*scan != ':') { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } scan++; // skip ':' @@ -2701,7 +2706,7 @@ // Read count parameter SKIP_WS(scan); if ((*scan < '0') || (*scan > '9')) { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } next = scan; @@ -2720,7 +2725,7 @@ continue; } if (*scan != ':') { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } scan++; // skip ':' @@ -2742,7 +2747,7 @@ } SKIP_WS(scan); if ((*scan < '0') || (*scan > '9')) { - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } next = scan; @@ -2762,7 +2767,7 @@ continue; } - KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); + __kmp_omp_places_syntax_warn(var); return FALSE; } @@ -2790,14 +2795,6 @@ return; } - // If OMP_PROC_BIND is not specified but OMP_PLACES is, - // then let OMP_PROC_BIND default to true. - if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) { - __kmp_nested_proc_bind.bind_types[0] = proc_bind_true; - } - - //__kmp_affinity_num_places = 0; - if (__kmp_match_str("threads", scan, &next)) { scan = next; __kmp_affinity_type = affinity_compact; @@ -2833,9 +2830,14 @@ __kmp_affinity_type = affinity_explicit; __kmp_affinity_gran = affinity_gran_fine; __kmp_affinity_dups = FALSE; - if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) { - __kmp_nested_proc_bind.bind_types[0] = proc_bind_true; - } + } else { + // Syntax error fallback + __kmp_affinity_type = affinity_compact; + __kmp_affinity_gran = affinity_gran_core; + __kmp_affinity_dups = FALSE; + } + if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) { + __kmp_nested_proc_bind.bind_types[0] = proc_bind_true; } return; } diff --git a/openmp/runtime/test/affinity/omp-places-invalid-syntax.c b/openmp/runtime/test/affinity/omp-places-invalid-syntax.c new file mode 100644 --- /dev/null +++ b/openmp/runtime/test/affinity/omp-places-invalid-syntax.c @@ -0,0 +1,11 @@ +// RUN: %libomp-compile && env KMP_SETTINGS=1 OMP_PLACES=invalid %libomp-run 2>&1 | FileCheck %s +// CHECK-DAG: Effective settings +// CHECK: OMP_PLACES= +// CHECK-SAME: cores +// REQUIRES: affinity + +int main() { + #pragma omp parallel + {} + return 0; +}