From: Nico Rieck Date: Mon, 24 Nov 2014 17:29:35 +0000 (+0000) Subject: Fix crash when using __if_exists in C mode X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8085206018533398b971bee83a7d092bcef8846;p=clang Fix crash when using __if_exists in C mode git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222665 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index 2bac56cdc4..4ddc5bfdad 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -1788,8 +1788,9 @@ bool Parser::ParseMicrosoftIfExistsCondition(IfExistsCondition& Result) { } // Parse nested-name-specifier. - ParseOptionalCXXScopeSpecifier(Result.SS, ParsedType(), - /*EnteringContext=*/false); + if (getLangOpts().CPlusPlus) + ParseOptionalCXXScopeSpecifier(Result.SS, ParsedType(), + /*EnteringContext=*/false); // Check nested-name specifier. if (Result.SS.isInvalid()) { diff --git a/test/Parser/ms-if-exists.c b/test/Parser/ms-if-exists.c new file mode 100644 index 0000000000..7dd20544a6 --- /dev/null +++ b/test/Parser/ms-if-exists.c @@ -0,0 +1,87 @@ +// RUN: %clang_cc1 %s -fsyntax-only -Wmicrosoft -verify -fms-extensions +// expected-no-diagnostics + +struct Type { +}; + +void test_if_exists_stmts() { + int b = 0; + __if_exists(Type) { + b++; + b++; + } + __if_exists(Type_not) { + this will not compile. + } + __if_not_exists(Type) { + this will not compile. + } + __if_not_exists(Type_not) { + b++; + b++; + } +} + +int if_exists_creates_no_scope() { + __if_exists(Type) { + int x; // 'x' is declared in the parent scope. + } + __if_not_exists(Type_not) { + x++; + } + return x; +} + +__if_exists(Type) { + int var23; +} + +__if_exists(Type_not) { + this will not compile. +} + +__if_not_exists(Type) { + this will not compile. +} + +__if_not_exists(Type_not) { + int var244; +} + +void test_if_exists_init_list() { + + int array1[] = { + 0, + __if_exists(Type) {2, } + 3 + }; + + int array2[] = { + 0, + __if_exists(Type_not) { this will not compile } + 3 + }; + + int array3[] = { + 0, + __if_not_exists(Type_not) {2, } + 3 + }; + + int array4[] = { + 0, + __if_not_exists(Type) { this will not compile } + 3 + }; + +} + + +void test_nested_if_exists() { + __if_exists(Type) { + int x = 42; + __if_not_exists(Type_not) { + x++; + } + } +}