r222665 - Fix crash when using __if_exists in C mode
Nico Rieck
nico.rieck at gmail.com
Mon Nov 24 09:29:36 PST 2014
Author: nrieck
Date: Mon Nov 24 11:29:35 2014
New Revision: 222665
URL: http://llvm.org/viewvc/llvm-project?rev=222665&view=rev
Log:
Fix crash when using __if_exists in C mode
Added:
cfe/trunk/test/Parser/ms-if-exists.c
Modified:
cfe/trunk/lib/Parse/Parser.cpp
Modified: cfe/trunk/lib/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=222665&r1=222664&r2=222665&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/Parser.cpp (original)
+++ cfe/trunk/lib/Parse/Parser.cpp Mon Nov 24 11:29:35 2014
@@ -1788,8 +1788,9 @@ bool Parser::ParseMicrosoftIfExistsCondi
}
// 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()) {
Added: cfe/trunk/test/Parser/ms-if-exists.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/ms-if-exists.c?rev=222665&view=auto
==============================================================================
--- cfe/trunk/test/Parser/ms-if-exists.c (added)
+++ cfe/trunk/test/Parser/ms-if-exists.c Mon Nov 24 11:29:35 2014
@@ -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++;
+ }
+ }
+}
More information about the cfe-commits
mailing list