diff options
Diffstat (limited to 'test')
219 files changed, 3173 insertions, 994 deletions
diff --git a/test/Analysis/MissingDealloc.m b/test/Analysis/MissingDealloc.m index 3942391..21460a1 100644 --- a/test/Analysis/MissingDealloc.m +++ b/test/Analysis/MissingDealloc.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -warn-objc-missing-dealloc '-DIBOutlet=__attribute__((iboutlet))' %s --verify +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -warn-objc-missing-dealloc '-DIBOutlet=__attribute__((iboutlet))' %s -verify typedef signed char BOOL; @protocol NSObject - (BOOL)isEqual:(id)object; @@ -39,7 +39,7 @@ typedef struct objc_selector *SEL; @end -@implementation TestSELs // no-warning +@implementation TestSELs - (id)init { if( (self = [super init]) ) { a = @selector(a); diff --git a/test/Analysis/casts.c b/test/Analysis/casts.c index fc9e27b..bee337a 100644 --- a/test/Analysis/casts.c +++ b/test/Analysis/casts.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region --verify %s +// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -verify %s // Test if the 'storage' region gets properly initialized after it is cast to // 'struct sockaddr *'. diff --git a/test/Analysis/casts.m b/test/Analysis/casts.m index 4e201bf..69a4260 100644 --- a/test/Analysis/casts.m +++ b/test/Analysis/casts.m @@ -1,5 +1,5 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic --verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region --verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -verify %s // Test function pointer casts. Currently we track function addresses using // loc::FunctionVal. Because casts can be arbitrary, do we need to model diff --git a/test/Analysis/cfref_PR2519.c b/test/Analysis/cfref_PR2519.c index ee1da1f..d9367d4 100644 --- a/test/Analysis/cfref_PR2519.c +++ b/test/Analysis/cfref_PR2519.c @@ -1,7 +1,7 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=basic -analyzer-constraints=basic -verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=basic -analyzer-constraints=range -verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=basic -verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=range -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=basic -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=range -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=basic -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -verify %s typedef unsigned char Boolean; typedef signed long CFIndex; diff --git a/test/Analysis/concrete-address.c b/test/Analysis/concrete-address.c index 31802d0..96080be 100644 --- a/test/Analysis/concrete-address.c +++ b/test/Analysis/concrete-address.c @@ -1,5 +1,5 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic --verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region --verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -verify %s void foo() { int *p = (int*) 0x10000; // Should not crash here. diff --git a/test/Analysis/dead-stores.c b/test/Analysis/dead-stores.c index 811ac81..e29eefd 100644 --- a/test/Analysis/dead-stores.c +++ b/test/Analysis/dead-stores.c @@ -1,8 +1,8 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -warn-dead-stores -verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=basic -warn-dead-stores -verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=range -warn-dead-stores -verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=basic -warn-dead-stores -verify %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -warn-dead-stores -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -warn-dead-stores -fblocks -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=basic -warn-dead-stores -fblocks -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=range -warn-dead-stores -fblocks -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=basic -warn-dead-stores -fblocks -verify %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -warn-dead-stores -fblocks -verify %s void f1() { int k, y; @@ -34,7 +34,7 @@ void f4(int k) { k = 2; // expected-warning {{never read}} } - + void f5() { int x = 4; // no-warning @@ -55,6 +55,24 @@ int f7(int *p) { return 1; } +int f7b(int *p) { + // This is allowed for defensive programming. + p = (0); // no-warning + return 1; +} + +int f7c(int *p) { + // This is allowed for defensive programming. + p = (void*) 0; // no-warning + return 1; +} + +int f7d(int *p) { + // This is allowed for defensive programming. + p = (void*) (0); // no-warning + return 1; +} + int f8(int *p) { extern int *baz(); if ((p = baz())) // expected-warning{{Although the value}} @@ -336,3 +354,19 @@ void f22() { break; } } + +void f23_aux(const char* s); +void f23(int argc, char **argv) { + int shouldLog = (argc > 1); // no-warning + ^{ + if (shouldLog) f23_aux("I did too use it!\n"); + else f23_aux("I shouldn't log. Wait.. d'oh!\n"); + }(); +} + +void f23_pos(int argc, char **argv) { + int shouldLog = (argc > 1); // expected-warning{{Value stored to 'shouldLog' during its initialization is never read}} + ^{ + f23_aux("I did too use it!\n"); + }(); +} diff --git a/test/Analysis/fields.c b/test/Analysis/fields.c index d6bc845..7ea6111 100644 --- a/test/Analysis/fields.c +++ b/test/Analysis/fields.c @@ -1,5 +1,5 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref %s --analyzer-store=basic -verify -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref %s --analyzer-store=region -verify +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref %s -analyzer-store=basic -verify +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref %s -analyzer-store=region -verify unsigned foo(); typedef struct bf { unsigned x:2; } bf; diff --git a/test/Analysis/misc-ps-64.m b/test/Analysis/misc-ps-64.m index 506dc8b..f520784 100644 --- a/test/Analysis/misc-ps-64.m +++ b/test/Analysis/misc-ps-64.m @@ -1,7 +1,7 @@ -// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=basic -analyzer-constraints=basic --verify -fblocks %s -// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=basic -analyzer-constraints=range --verify -fblocks %s -// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=basic --verify -fblocks %s -// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=range --verify -fblocks %s +// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=basic -verify -fblocks %s +// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=range -verify -fblocks %s +// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=basic -verify -fblocks %s +// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -verify -fblocks %s // <rdar://problem/6440393> - A bunch of misc. failures involving evaluating // these expressions and building CFGs. These tests are here to prevent diff --git a/test/Analysis/misc-ps-basic-store.m b/test/Analysis/misc-ps-basic-store.m index 2b99134..2a98234 100644 --- a/test/Analysis/misc-ps-basic-store.m +++ b/test/Analysis/misc-ps-basic-store.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=basic --verify -fblocks %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -verify -fblocks %s //--------------------------------------------------------------------------- // Test case 'checkaccess_union' differs for region store and basic store. diff --git a/test/Analysis/misc-ps-eager-assume.m b/test/Analysis/misc-ps-eager-assume.m index 66eb125..e702cb9 100644 --- a/test/Analysis/misc-ps-eager-assume.m +++ b/test/Analysis/misc-ps-eager-assume.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=range --verify -fblocks %s -analyzer-eagerly-assume +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -verify -fblocks %s -analyzer-eagerly-assume // Delta-reduced header stuff (needed for test cases). typedef signed char BOOL; diff --git a/test/Analysis/misc-ps-ranges.m b/test/Analysis/misc-ps-ranges.m index 49cc593..058c903 100644 --- a/test/Analysis/misc-ps-ranges.m +++ b/test/Analysis/misc-ps-ranges.m @@ -1,5 +1,5 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=basic -analyzer-constraints=range --verify -fblocks %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=range --verify -fblocks %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=range -verify -fblocks %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -verify -fblocks %s // <rdar://problem/6776949> // main's 'argc' argument is always > 0 diff --git a/test/Analysis/misc-ps-region-store-i386.m b/test/Analysis/misc-ps-region-store-i386.m index a833a65..7b0d61b 100644 --- a/test/Analysis/misc-ps-region-store-i386.m +++ b/test/Analysis/misc-ps-region-store-i386.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region --verify -fblocks %s +// RUN: clang-cc -triple i386-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -verify -fblocks %s // Here is a case where a pointer is treated as integer, invalidated as an // integer, and then used again as a pointer. This test just makes sure diff --git a/test/Analysis/misc-ps-region-store-x86_64.m b/test/Analysis/misc-ps-region-store-x86_64.m index 7e614fd..8c865ab 100644 --- a/test/Analysis/misc-ps-region-store-x86_64.m +++ b/test/Analysis/misc-ps-region-store-x86_64.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region --verify -fblocks %s +// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -verify -fblocks %s // Here is a case where a pointer is treated as integer, invalidated as an // integer, and then used again as a pointer. This test just makes sure diff --git a/test/Analysis/misc-ps-region-store.m b/test/Analysis/misc-ps-region-store.m index 7ebc4a9..e5113ba 100644 --- a/test/Analysis/misc-ps-region-store.m +++ b/test/Analysis/misc-ps-region-store.m @@ -1,5 +1,5 @@ -// RUN: clang-cc -triple i386-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region --verify -fblocks %s -// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region --verify -fblocks %s +// RUN: clang-cc -triple i386-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -verify -fblocks %s +// RUN: clang-cc -triple x86_64-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -verify -fblocks %s typedef struct objc_selector *SEL; typedef signed char BOOL; @@ -470,3 +470,74 @@ int pr3135() { return 0; } +//===----------------------------------------------------------------------===// +// <rdar://problem/7403269> - Test that we handle compound initializers with +// partially unspecified array values. Previously this caused a crash. +//===----------------------------------------------------------------------===// + +typedef struct RDar7403269 { + unsigned x[10]; + unsigned y; +} RDar7403269; + +void rdar7403269() { + RDar7403269 z = { .y = 0 }; + if (z.x[4] == 0) + return; + int *p = 0; + *p = 0xDEADBEEF; // no-warning +} + +typedef struct RDar7403269_b { + struct zorg { int w; int k; } x[10]; + unsigned y; +} RDar7403269_b; + +void rdar7403269_b() { + RDar7403269_b z = { .y = 0 }; + if (z.x[5].w == 0) + return; + int *p = 0; + *p = 0xDEADBEEF; // no-warning +} + +void rdar7403269_b_pos() { + RDar7403269_b z = { .y = 0 }; + if (z.x[5].w == 1) + return; + int *p = 0; + *p = 0xDEADBEEF; // expected-warning{{Dereference of null pointer}} +} + + +//===----------------------------------------------------------------------===// +// Test that incrementing a non-null pointer results in a non-null pointer. +// (<rdar://problem/7191542>) +//===----------------------------------------------------------------------===// + +void test_increment_nonnull_rdar_7191542(const char *path) { + const char *alf = 0; + + for (;;) { + // When using basic-store, we get a null dereference here because we lose information + // about path after the pointer increment. + char c = *path++; // no-warning + if (c == 'a') { + alf = path; + } + + if (alf) + return; + } +} + +//===----------------------------------------------------------------------===// +// Test that the store (implicitly) tracks values for doubles/floats that are +// uninitialized (<rdar://problem/6811085>) +//===----------------------------------------------------------------------===// + +double rdar_6811085(void) { + double u; + return u + 10; // expected-warning{{The left operand of '+' is a garbage value}} +} + diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index d2eef0d..42168b9 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -1,8 +1,8 @@ // NOTE: Use '-fobjc-gc' to test the analysis being run twice, and multiple reports are not issued. -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=basic -fobjc-gc -analyzer-constraints=basic --verify -fblocks %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=basic -analyzer-constraints=range --verify -fblocks %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=basic --verify -fblocks %s -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=range --verify -fblocks %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -fobjc-gc -analyzer-constraints=basic -verify -fblocks %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=range -verify -fblocks %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=basic -verify -fblocks %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -verify -fblocks %s typedef struct objc_ivar *Ivar; typedef struct objc_selector *SEL; @@ -750,3 +750,46 @@ void test_undefined_array_subscript() { int *p = &a[i]; // expected-warning{{Array subscript is undefined}} } @end + +//===----------------------------------------------------------------------===// +// Test using an uninitialized value as a branch condition. +//===----------------------------------------------------------------------===// + +int test_uninit_branch(void) { + int x; + if (x) // expected-warning{{Branch condition evaluates to a garbage value}} + return 1; + return 0; +} + +int test_uninit_branch_b(void) { + int x; + return x ? 1 : 0; // expected-warning{{Branch condition evaluates to a garbage value}} +} + +int test_uninit_branch_c(void) { + int x; + if ((short)x) // expected-warning{{Branch condition evaluates to a garbage value}} + return 1; + return 0; +} + +//===----------------------------------------------------------------------===// +// Test passing an undefined value in a message or function call. +//===----------------------------------------------------------------------===// + +void test_bad_call_aux(int x); +void test_bad_call(void) { + int y; + test_bad_call_aux(y); // expected-warning{{Pass-by-value argument in function call is undefined}} +} + +@interface TestBadArg {} +- (void) testBadArg:(int) x; +@end + +void test_bad_msg(TestBadArg *p) { + int y; + [p testBadArg:y]; // expected-warning{{Pass-by-value argument in message expression is undefined}} +} + diff --git a/test/Analysis/nil-receiver-undefined-larger-than-voidptr-ret.m b/test/Analysis/nil-receiver-undefined-larger-than-voidptr-ret.m index 536c4a1..75cdf6e 100644 --- a/test/Analysis/nil-receiver-undefined-larger-than-voidptr-ret.m +++ b/test/Analysis/nil-receiver-undefined-larger-than-voidptr-ret.m @@ -1,5 +1,7 @@ -// RUN: clang-cc -triple i386-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-constraints=basic -analyzer-store=basic %s -verify -// RUN: clang-cc -triple i386-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-constraints=basic -analyzer-store=region %s -verify +// RUN: clang-cc -triple i386-apple-darwin8 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-constraints=basic -analyzer-store=basic %s 2>&1 | FileCheck -check-prefix=darwin8 %s +// RUN: clang-cc -triple i386-apple-darwin8 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-constraints=basic -analyzer-store=region %s 2>&1 | FileCheck -check-prefix=darwin8 %s +// RUN: clang-cc -triple i386-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-constraints=basic -analyzer-store=basic %s 2>&1 | FileCheck -check-prefix=darwin9 %s +// RUN: clang-cc -triple i386-apple-darwin9 -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-constraints=basic -analyzer-store=region %s 2>&1 | FileCheck -check-prefix=darwin9 %s @interface MyClass {} - (void *)voidPtrM; @@ -28,20 +30,20 @@ void createFoo() { void createFoo2() { MyClass *obj = 0; - long double ld = [obj longDoubleM]; // expected-warning{{The receiver in the message expression is 'nil' and results in the returned value}} + long double ld = [obj longDoubleM]; // expected-warning{{The receiver of message 'longDoubleM' is nil and returns a value of type 'long double' that will be garbage}} } void createFoo3() { MyClass *obj; obj = 0; - long long ll = [obj longlongM]; // expected-warning{{The receiver in the message expression is 'nil' and results in the returned value}} + long long ll = [obj longlongM]; // expected-warning{{The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage}} } void createFoo4() { MyClass *obj = 0; - double d = [obj doubleM]; // expected-warning{{The receiver in the message expression is 'nil' and results in the returned value}} + double d = [obj doubleM]; // expected-warning{{The receiver of message 'doubleM' is nil and returns a value of type 'double' that will be garbage}} } void createFoo5() { @@ -59,10 +61,22 @@ void handleNilPruneLoop(MyClass *obj) { long long j = [obj longlongM]; // no-warning } - long long j = [obj longlongM]; // expected-warning{{The receiver in the message expression is 'nil' and results in the returned value}} + long long j = [obj longlongM]; // expected-warning{{The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage}} } int handleVoidInComma() { MyClass *obj = 0; return [obj voidM], 0; } + +int marker(void) { // control reaches end of non-void function +} + +// CHECK-darwin8: warning: The receiver of message 'longDoubleM' is nil and returns a value of type 'long double' that will be garbage +// CHECK-darwin8: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage +// CHECK-darwin8: warning: The receiver of message 'doubleM' is nil and returns a value of type 'double' that will be garbage +// CHECK-darwin8: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage +// CHECK-darwin8: control reaches end of non-void function +// CHECK-darwin8: 5 diagnostics generated +// CHECK-darwin9: control reaches end of non-void function +// CHECK-darwin9: 1 diagnostic generated diff --git a/test/Analysis/null-deref-ps.c b/test/Analysis/null-deref-ps.c index f5c6a10..c604653 100644 --- a/test/Analysis/null-deref-ps.c +++ b/test/Analysis/null-deref-ps.c @@ -26,7 +26,7 @@ int f2(struct foo_struct* p) { if (p) p->x = 1; - return p->x++; // expected-warning{{Dereference of null pointer.}} + return p->x++; // expected-warning{{Dereference of null pointer}} } int f3(char* x) { @@ -36,7 +36,7 @@ int f3(char* x) { if (x) return x[i - 1]; - return x[i+1]; // expected-warning{{Dereference of null pointer.}} + return x[i+1]; // expected-warning{{Dereference of null pointer}} } int f3_b(char* x) { @@ -46,7 +46,7 @@ int f3_b(char* x) { if (x) return x[i - 1]; - return x[i+1]++; // expected-warning{{Dereference of null pointer.}} + return x[i+1]++; // expected-warning{{Dereference of null pointer}} } int f4(int *p) { @@ -57,7 +57,7 @@ int f4(int *p) { return 1; int *q = (int*) x; - return *q; // expected-warning{{Dereference of null pointer.}} + return *q; // expected-warning{{Dereference of null pointer loaded from variable 'q'}} } int f4_b() { diff --git a/test/Analysis/plist-output.m b/test/Analysis/plist-output.m index 8bd616a..971d476 100644 --- a/test/Analysis/plist-output.m +++ b/test/Analysis/plist-output.m @@ -1,9 +1,42 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref --analyzer-store=region -analyzer-constraints=range -fblocks --analyzer-output=plist -o - %s | FileCheck %s +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-output=plist -o - %s | FileCheck %s void test_null_init(void) { int *p = 0; *p = 0xDEADBEEF; } + +void test_null_assign(void) { + int *p; + p = 0; + *p = 0xDEADBEEF; +} + +void test_null_assign_transitive(void) { + int *p; + p = 0; + int *q = p; + *q = 0xDEADBEEF; +} + +void test_null_cond(int *p) { + if (!p) { + *p = 0xDEADBEEF; + } +} + +void test_null_cond_transitive(int *q) { + if (!q) { + int *p = q; + *p = 0xDEADBEEF; + } +} + +void test_null_field(void) { + struct s { int *p; } x; + x.p = 0; + *(x.p) = 0xDEADBEEF; +} + // CHECK: <?xml version="1.0" encoding="UTF-8"?> // CHECK: <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> // CHECK: <plist version="1.0"> @@ -102,6 +135,702 @@ void test_null_init(void) { // CHECK: </array> // CHECK: </array> // CHECK: <key>extended_message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: <key>message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>description</key><string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: <key>category</key><string>Logic error</string> +// CHECK: <key>type</key><string>Dereference of null pointer</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>5</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>path</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>9</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>9</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>10</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>10</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>10</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>10</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>10</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Null pointer value stored to 'p'</string> +// CHECK: <key>message</key> +// CHECK: <string>Null pointer value stored to 'p'</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>10</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>10</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>col</key><integer>4</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>col</key><integer>4</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: <key>message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>description</key><string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: <key>category</key><string>Logic error</string> +// CHECK: <key>type</key><string>Dereference of null pointer</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>11</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>path</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>15</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>15</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>17</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>17</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>17</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>17</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>17</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Variable 'q' initialized to a null pointer value</string> +// CHECK: <key>message</key> +// CHECK: <string>Variable 'q' initialized to a null pointer value</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>17</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>17</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>col</key><integer>4</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>col</key><integer>4</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'q'</string> +// CHECK: <key>message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'q'</string> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>description</key><string>Dereference of null pointer loaded from variable 'q'</string> +// CHECK: <key>category</key><string>Logic error</string> +// CHECK: <key>type</key><string>Dereference of null pointer</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>18</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>path</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Assuming pointer value is null</string> +// CHECK: <key>message</key> +// CHECK: <string>Assuming pointer value is null</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: <key>message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>description</key><string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: <key>category</key><string>Logic error</string> +// CHECK: <key>type</key><string>Dereference of null pointer</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>path</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Assuming pointer value is null</string> +// CHECK: <key>message</key> +// CHECK: <string>Assuming pointer value is null</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>30</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>30</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>30</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>30</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>30</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: <key>message</key> +// CHECK: <string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>description</key><string>Dereference of null pointer loaded from variable 'p'</string> +// CHECK: <key>category</key><string>Logic error</string> +// CHECK: <key>type</key><string>Dereference of null pointer</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>30</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>path</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>10</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>10</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>10</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>10</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>extended_message</key> // CHECK: <string>Dereference of null pointer</string> // CHECK: <key>message</key> // CHECK: <string>Dereference of null pointer</string> @@ -109,10 +838,10 @@ void test_null_init(void) { // CHECK: </array> // CHECK: <key>description</key><string>Dereference of null pointer</string> // CHECK: <key>category</key><string>Logic error</string> -// CHECK: <key>type</key><string>Null pointer dereference</string> +// CHECK: <key>type</key><string>Dereference of null pointer</string> // CHECK: <key>location</key> // CHECK: <dict> -// CHECK: <key>line</key><integer>5</integer> +// CHECK: <key>line</key><integer>37</integer> // CHECK: <key>col</key><integer>3</integer> // CHECK: <key>file</key><integer>0</integer> // CHECK: </dict> diff --git a/test/Analysis/rdar-6442306-1.m b/test/Analysis/rdar-6442306-1.m index 7b0a1a6..1d8bbd3 100644 --- a/test/Analysis/rdar-6442306-1.m +++ b/test/Analysis/rdar-6442306-1.m @@ -1,5 +1,5 @@ -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref %s --analyzer-store=basic -verify -// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref %s --analyzer-store=region -verify +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref %s -analyzer-store=basic -verify +// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref %s -analyzer-store=region -verify typedef int bar_return_t; typedef struct { diff --git a/test/Analysis/rdar-6600344-nil-receiver-undefined-struct-ret.m b/test/Analysis/rdar-6600344-nil-receiver-undefined-struct-ret.m index 7230f21..9d6fe5b 100644 --- a/test/Analysis/rdar-6600344-nil-receiver-undefined-struct-ret.m +++ b/test/Analysis/rdar-6600344-nil-receiver-undefined-struct-ret.m @@ -15,12 +15,12 @@ typedef struct Foo { int x; } Bar; void createFoo() { MyClass *obj = 0; - Bar f = [obj foo]; // expected-warning{{The receiver in the message expression is 'nil' and results in the returned value (of type 'Bar') to be garbage or otherwise undefined.}} + Bar f = [obj foo]; // expected-warning{{The receiver of message 'foo' is nil and returns a value of type 'Bar' that will be garbage}} } void createFoo2() { MyClass *obj = 0; [obj foo]; // no-warning - Bar f = [obj foo]; // expected-warning{{The receiver in the message expression is 'nil' and results in the returned value (of type 'Bar') to be garbage or otherwise undefined.}} + Bar f = [obj foo]; // expected-warning{{The receiver of message 'foo' is nil and returns a value of type 'Bar' that will be garbage}} } diff --git a/test/Analysis/region-only-test.c b/test/Analysis/region-only-test.c deleted file mode 100644 index 8908adb..0000000 --- a/test/Analysis/region-only-test.c +++ /dev/null @@ -1,13 +0,0 @@ -// RUN: clang-cc -analyze -checker-cfref -analyzer-store=region -verify %s - -// Region store must be enabled for tests in this file. - -// Exercise creating ElementRegion with symbolic super region. -void foo(int* p) { - int *x; - int a; - if (p[0] == 1) - x = &a; - if (p[0] == 1) - (void)*x; // no-warning -} diff --git a/test/Analysis/retain-release-gc-only.m b/test/Analysis/retain-release-gc-only.m index 3eeebc4..ab52938 100644 --- a/test/Analysis/retain-release-gc-only.m +++ b/test/Analysis/retain-release-gc-only.m @@ -1,5 +1,5 @@ -// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -verify -fobjc-gc-only %s -// RUN: clang-cc -analyze -checker-cfref -analyzer-store=region -fobjc-gc-only -verify %s +// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -verify -fobjc-gc-only -fblocks %s +// RUN: clang-cc -analyze -checker-cfref -analyzer-store=region -fobjc-gc-only -fblocks -verify %s //===----------------------------------------------------------------------===// // Header stuff. @@ -93,6 +93,7 @@ typedef struct _NSZone NSZone; + (id)alloc; - (void)dealloc; - (void)release; +- (id)copy; @end @interface NSObject (NSCoderMethods) - (id)awakeAfterUsingCoder:(NSCoder *)aDecoder; @@ -332,6 +333,17 @@ void rdar_6250216(void) { [pool release]; // expected-warning{{Use -drain instead of -release when using NSAutoreleasePool and garbage collection}} } + +//===----------------------------------------------------------------------===// +// <rdar://problem/7407273> Don't crash when analyzing messages sent to blocks +//===----------------------------------------------------------------------===// + +@class RDar7407273; +typedef void (^RDar7407273Block)(RDar7407273 *operation); +void rdar7407273(RDar7407273Block b) { + [b copy]; +} + //===----------------------------------------------------------------------===// // Tests of ownership attributes. //===----------------------------------------------------------------------===// diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m index dfea2e7..bc9f0b7 100644 --- a/test/Analysis/retain-release.m +++ b/test/Analysis/retain-release.m @@ -1,5 +1,5 @@ -// RUN: clang-cc -triple x86_64-apple-darwin10 -analyze -checker-cfref -analyzer-store=basic -verify %s -// RUN: clang-cc -triple x86_64-apple-darwin10 -analyze -checker-cfref -analyzer-store=region -verify %s +// RUN: clang-cc -triple x86_64-apple-darwin10 -analyze -checker-cfref -analyzer-store=basic -fblocks -verify %s +// RUN: clang-cc -triple x86_64-apple-darwin10 -analyze -checker-cfref -analyzer-store=region -fblocks -verify %s #if __has_feature(attribute_ns_returns_retained) #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) @@ -1162,6 +1162,19 @@ void rdar7306898(void) { } //===----------------------------------------------------------------------===// +// <rdar://problem/7252064> sending 'release', 'retain', etc. to a Class +// directly is not likely what the user intended +//===----------------------------------------------------------------------===// + +@interface RDar7252064 : NSObject @end +void rdar7252064(void) { + [RDar7252064 release]; // expected-warning{{The 'release' message should be sent to instances of class 'RDar7252064' and not the class directly}} + [RDar7252064 retain]; // expected-warning{{The 'retain' message should be sent to instances of class 'RDar7252064' and not the class directly}} + [RDar7252064 autorelease]; // expected-warning{{The 'autorelease' message should be sent to instances of class 'RDar7252064' and not the class directly}} + [NSAutoreleasePool drain]; // expected-warning{{method '+drain' not found}} expected-warning{{The 'drain' message should be sent to instances of class 'NSAutoreleasePool' and not the class directly}} +} + +//===----------------------------------------------------------------------===// // Tests of ownership attributes. //===----------------------------------------------------------------------===// @@ -1259,3 +1272,34 @@ void test_panic_pos_2(int x) { panic(); } +//===----------------------------------------------------------------------===// +// Test uses of blocks (closures) +//===----------------------------------------------------------------------===// + +void test_blocks_1_pos(void) { + NSNumber *number = [[NSNumber alloc] initWithInt:5]; // expected-warning{{leak}} + ^{}(); +} + +void test_blocks_1_indirect_release(void) { + NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning + ^{ [number release]; }(); +} + +void test_blocks_1_indirect_retain(void) { + // Eventually this should be reported as a leak. + NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning + ^{ [number retain]; }(); +} + +void test_blocks_1_indirect_release_via_call(void) { + NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning + ^(NSObject *o){ [o release]; }(number); +} + +void test_blocks_1_indirect_retain_via_call(void) { + // Eventually this should be reported as a leak. + NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning + ^(NSObject *o){ [o retain]; }(number); +} + diff --git a/test/Analysis/stack-addr-ps.c b/test/Analysis/stack-addr-ps.c index f26e2f0..5d1ce25 100644 --- a/test/Analysis/stack-addr-ps.c +++ b/test/Analysis/stack-addr-ps.c @@ -1,5 +1,5 @@ -// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -verify %s -// RUN: clang-cc -analyze -checker-cfref -analyzer-store=region -verify %s +// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -fblocks -verify %s +// RUN: clang-cc -analyze -checker-cfref -analyzer-store=region -fblocks -verify %s int* f1() { int x = 0; @@ -55,3 +55,16 @@ int struct_test(struct baz byVal, int flag) { return byVal.y[0]; // no-warning } } + +typedef int (^ComparatorBlock)(int a, int b); +ComparatorBlock test_return_block(void) { + ComparatorBlock b = ^int(int a, int b){ return a > b; }; + return b; // expected-warning{{Address of stack-allocated block declared on line 61 returned to caller}} +} + +ComparatorBlock test_return_block_neg_aux(void); +ComparatorBlock test_return_block_neg(void) { + ComparatorBlock b = test_return_block_neg_aux(); + return b; // no-warning +} + diff --git a/test/Analysis/uninit-msg-expr.m b/test/Analysis/uninit-msg-expr.m index c2b7366..46e441f 100644 --- a/test/Analysis/uninit-msg-expr.m +++ b/test/Analysis/uninit-msg-expr.m @@ -42,7 +42,7 @@ extern NSString * const NSUndoManagerCheckpointNotification; unsigned f1() { NSString *aString; - return [aString length]; // expected-warning {{Receiver in message expression is an uninitialized value}} + return [aString length]; // expected-warning {{Receiver in message expression is a garbage value}} } unsigned f2() { diff --git a/test/Analysis/uninit-ps-rdar6145427.m b/test/Analysis/uninit-ps-rdar6145427.m index d9e7318..7be32b4 100644 --- a/test/Analysis/uninit-ps-rdar6145427.m +++ b/test/Analysis/uninit-ps-rdar6145427.m @@ -30,7 +30,7 @@ extern NSString * const NSUndoManagerCheckpointNotification; int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - id someUnintializedPointer = [someUnintializedPointer objectAtIndex:0]; // expected-warning{{Receiver in message expression is an uninitialized value.}} + id someUnintializedPointer = [someUnintializedPointer objectAtIndex:0]; // expected-warning{{Receiver in message expression is a garbage value}} NSLog(@"%@", someUnintializedPointer); [pool drain]; return 0; diff --git a/test/Analysis/unused-ivars.m b/test/Analysis/unused-ivars.m index 754799b..bbbf6ae 100644 --- a/test/Analysis/unused-ivars.m +++ b/test/Analysis/unused-ivars.m @@ -65,3 +65,19 @@ } @end +//===----------------------------------------------------------------------===// +// <rdar://problem/7254495> - ivars referenced by lexically nested functions +// should not be flagged as unused +//===----------------------------------------------------------------------===// + +@interface RDar7254495 { +@private + int x; // no-warning +} +@end + +@implementation RDar7254495 +int radar_7254495(RDar7254495 *a) { + return a->x; +} +@end diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cd822f6..f39eb2a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -40,6 +40,11 @@ if(PYTHONINTERP_FOUND) set(CLANG_TEST_EXTRA_ARGS "--no-progress-bar") endif() + option(CLANG_TEST_USE_VG "Run Clang tests under Valgrind" OFF) + if(CLANG_TEST_USE_VG) + set(CLANG_TEST_EXTRA_ARGS ${CLANG_TEST_EXTRA_ARGS} "--vg") + endif () + foreach(testdir ${CLANG_TEST_DIRECTORIES}) add_custom_target(clang-test-${testdir} COMMAND ${PYTHON_EXECUTABLE} diff --git a/test/CXX/basic/basic.link/p9.cpp b/test/CXX/basic/basic.link/p9.cpp new file mode 100644 index 0000000..ecff3ee --- /dev/null +++ b/test/CXX/basic/basic.link/p9.cpp @@ -0,0 +1,11 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +// FIXME: This test is woefully incomplete. +namespace N { } // expected-note{{here}} + +// First bullet: two names with external linkage that refer to +// different kinds of entities. +void f() { + int N(); // expected-error{{redefinition}} +} + diff --git a/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp b/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp index cebc3e9..418059d 100644 --- a/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp +++ b/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp @@ -13,5 +13,5 @@ try { } catch (int a) { // expected-error {{redefinition of 'a'}} int b; // expected-error {{redefinition of 'b'}} - ++c; // expected-error {{use of undeclared identifion 'c'}} + ++c; // expected-error {{use of undeclared identifier 'c'}} } diff --git a/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p4.cpp b/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p4.cpp index 4b15828..0cb8186 100644 --- a/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p4.cpp +++ b/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p4.cpp @@ -41,8 +41,8 @@ namespace N1 { void m() { - void f(int, int); // expected-note{{candidate}} - f(4); // expected-error{{no matching}} + void f(int, int); + f(4); // expected-error{{too few arguments to function call}} void f(int, int = 5); // expected-note{{previous definition}} f(4); // okay void f(int, int = 5); // expected-error{{redefinition of default argument}} diff --git a/test/CXX/temp/temp.decls/temp.class.spec/temp.class.spec.mfunc/p1.cpp b/test/CXX/temp/temp.decls/temp.class.spec/temp.class.spec.mfunc/p1.cpp index b63c56c..90bb162 100644 --- a/test/CXX/temp/temp.decls/temp.class.spec/temp.class.spec.mfunc/p1.cpp +++ b/test/CXX/temp/temp.decls/temp.class.spec/temp.class.spec.mfunc/p1.cpp @@ -1,5 +1,4 @@ // RUN: clang-cc -fsyntax-only -verify %s - template<typename T, int N> struct A; diff --git a/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1.cpp b/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1.cpp index 725b61c..6c82720 100644 --- a/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1.cpp +++ b/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1.cpp @@ -1,5 +1,4 @@ // RUN: clang-cc -fsyntax-only -verify %s - template<typename T, typename U> // expected-note{{previous template}} class X0 { public: @@ -66,3 +65,36 @@ X0<T, U>::operator T*() const { namespace N { template <class X> class A {void a();}; } namespace N { template <class X> void A<X>::a() {} } + +// PR5566 +template<typename T> +struct X1 { + template<typename U> + struct B { void f(); }; +}; + +template<typename T> +template<typename U> +void X1<T>::template B<U>::f() { } + +// PR5527 +template <template <class> class T> +class X2 { + template <class F> + class Bar { + void Func(); + }; +}; + +template <template <class> class T> +template <class F> +void X2<T>::Bar<F>::Func() {} + +// PR5528 +template <template <class> class T> +class X3 { + void F(); +}; + +template <template <class> class T> +void X3<T>::F() {} diff --git a/test/CXX/temp/temp.param/p2.cpp b/test/CXX/temp/temp.param/p2.cpp index a402cf6..d40f99b 100644 --- a/test/CXX/temp/temp.param/p2.cpp +++ b/test/CXX/temp/temp.param/p2.cpp @@ -8,7 +8,8 @@ template<typename T> struct X; // typename followed by aqualified-id denotes the type in a non-type // parameter-declaration. -// FIXME: template<typename T, typename T::type Value> struct Y; +template<typename T, typename T::type Value> struct Y0; +template<typename T, typename X<T>::type Value> struct Y1; // A storage class shall not be specified in a template-parameter declaration. template<static int Value> struct Z; // FIXME: expect an error diff --git a/test/CXX/temp/temp.param/p9.cpp b/test/CXX/temp/temp.param/p9.cpp new file mode 100644 index 0000000..d6b7405 --- /dev/null +++ b/test/CXX/temp/temp.param/p9.cpp @@ -0,0 +1,23 @@ +// RUN: clang-cc -fsyntax-only -std=c++98 -verify %s + +// A default template-argument shall not be specified in a function +// template declaration or a function template definition +template<typename T = int> // expected-error{{cannot have a default argument}} + void foo0(T); +template<typename T = int> // expected-error{{cannot have a default argument}} + void foo1(T) { } + +// [...] nor in the template-parameter-list of the definition of a +// member of a class template. +template<int N> +struct X0 { + void f(); +}; + +template<int N = 0> // expected-error{{cannot add a default template argument}} +void X0<N>::f() { } + +class X1 { + template<template<int> class TT = X0> // expected-error{{not permitted on a friend template}} + friend void f2(); +}; diff --git a/test/CodeCompletion/property.m b/test/CodeCompletion/property.m deleted file mode 100644 index 184519b..0000000 --- a/test/CodeCompletion/property.m +++ /dev/null @@ -1,29 +0,0 @@ -// Note: the run lines follow their respective tests, since line/column -// matter in this test. - -@interface Foo { - void *isa; -} -@property(copy) Foo *myprop; -@property(retain, nonatomic) id xx; -// RUN: clang-cc -fsyntax-only -code-completion-at=%s:7:11 %s -o - | FileCheck -check-prefix=CC1 %s -// CC1: assign -// CC1-NEXT: copy -// CC1-NEXT: getter -// CC1-NEXT: nonatomic -// CC1-NEXT: readonly -// CC1-NEXT: readwrite -// CC1-NEXT: retain -// CC1-NEXT: setter -// RUN: clang-cc -fsyntax-only -code-completion-at=%s:8:18 %s -o - | FileCheck -check-prefix=CC2 %s -// CC2: assign -// CC2-NEXT: copy -// CC2-NEXT: getter -// CC2-NEXT: nonatomic -// CC2-NEXT: readonly -// CC2-NEXT: readwrite -// CC2-NEXT: setter -@end - - - diff --git a/test/CodeGen/2008-07-17-no-emit-on-error.c b/test/CodeGen/2008-07-17-no-emit-on-error.c index fbff541..6266b50 100644 --- a/test/CodeGen/2008-07-17-no-emit-on-error.c +++ b/test/CodeGen/2008-07-17-no-emit-on-error.c @@ -1,10 +1,14 @@ // RUN: rm -f %t1.bc +// RUN: clang-cc -DPASS %s -emit-llvm-bc -o %t1.bc +// RUN: test -f %t1.bc // RUN: not clang-cc %s -emit-llvm-bc -o %t1.bc // RUN: not test -f %t1.bc void f() { } +#ifndef PASS void g() { *10; } +#endif diff --git a/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c b/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c index db3c4b2..4aa28f8 100644 --- a/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c +++ b/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple=i686-apple-darwin9 --emit-llvm -o - %s | FileCheck %s +// RUN: clang-cc -triple=i686-apple-darwin9 -emit-llvm -o - %s | FileCheck %s struct et7 { float lv7[0]; diff --git a/test/CodeGen/2008-07-30-implicit-initialization.c b/test/CodeGen/2008-07-30-implicit-initialization.c index 9cd5300..b225a14 100644 --- a/test/CodeGen/2008-07-30-implicit-initialization.c +++ b/test/CodeGen/2008-07-30-implicit-initialization.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-unknown-unknown --emit-llvm-bc -o - %s | opt --std-compile-opts | llvm-dis > %t +// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt --std-compile-opts | llvm-dis > %t // RUN: grep "ret i32" %t | count 2 // RUN: grep "ret i32 0" %t | count 2 // <rdar://problem/6113085> diff --git a/test/CodeGen/2008-07-30-redef-of-bitcasted-decl.c b/test/CodeGen/2008-07-30-redef-of-bitcasted-decl.c index c374f8d..9fce0ae 100644 --- a/test/CodeGen/2008-07-30-redef-of-bitcasted-decl.c +++ b/test/CodeGen/2008-07-30-redef-of-bitcasted-decl.c @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o - %s +// RUN: clang-cc -emit-llvm -o - %s // <rdar://problem/6108358> /* For posterity, the issue here begins initial "char []" decl for diff --git a/test/CodeGen/2008-08-04-void-pointer-arithmetic.c b/test/CodeGen/2008-08-04-void-pointer-arithmetic.c index 22815f3..bd4d8f8 100644 --- a/test/CodeGen/2008-08-04-void-pointer-arithmetic.c +++ b/test/CodeGen/2008-08-04-void-pointer-arithmetic.c @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o - %s +// RUN: clang-cc -emit-llvm -o - %s // <rdar://problem/6122967> int f0(void *a, void *b) { diff --git a/test/CodeGen/2008-08-19-cast-of-typedef.c b/test/CodeGen/2008-08-19-cast-of-typedef.c index 3db5e90..3435384 100644 --- a/test/CodeGen/2008-08-19-cast-of-typedef.c +++ b/test/CodeGen/2008-08-19-cast-of-typedef.c @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s typedef short T[4]; struct s { diff --git a/test/CodeGen/PR2001-bitfield-reload.c b/test/CodeGen/PR2001-bitfield-reload.c index 1fef3c5..4dec65f 100644 --- a/test/CodeGen/PR2001-bitfield-reload.c +++ b/test/CodeGen/PR2001-bitfield-reload.c @@ -1,6 +1,4 @@ -// RUN: clang-cc -triple i386-unknown-unknown --emit-llvm-bc -o - %s | opt --std-compile-opts | llvm-dis > %t -// RUN: grep "ret i32" %t | count 1 -// RUN: grep "ret i32 1" %t | count 1 +// RUN: clang-cc -triple i386-unknown-unknown -O3 -emit-llvm -o - %s | FileCheck %s // PR2001 /* Test that the result of the assignment properly uses the value *in @@ -13,5 +11,6 @@ static int foo(int i) { } int bar() { + // CHECK: ret i32 1 return foo(-5) == -1; } diff --git a/test/CodeGen/arm-arguments.c b/test/CodeGen/arm-arguments.c index 3b2c433..945c1f2 100644 --- a/test/CodeGen/arm-arguments.c +++ b/test/CodeGen/arm-arguments.c @@ -1,5 +1,5 @@ -// RUN: clang-cc -triple armv7-apple-darwin9 -target-abi=apcs-gnu -emit-llvm -w -o - %s | FileCheck -check-prefix=APCS-GNU %s -// RUN: clang-cc -triple armv7-apple-darwin9 -target-abi=aapcs -emit-llvm -w -o - %s | FileCheck -check-prefix=AAPCS %s +// RUN: clang-cc -triple armv7-apple-darwin9 -target-abi apcs-gnu -emit-llvm -w -o - %s | FileCheck -check-prefix=APCS-GNU %s +// RUN: clang-cc -triple armv7-apple-darwin9 -target-abi aapcs -emit-llvm -w -o - %s | FileCheck -check-prefix=AAPCS %s // APCS-GNU: define arm_apcscc signext i8 @f0() // AAPCS: define arm_aapcscc signext i8 @f0() diff --git a/test/CodeGen/builtins-ffs_parity_popcount.c b/test/CodeGen/builtins-ffs_parity_popcount.c deleted file mode 100644 index 74e104b..0000000 --- a/test/CodeGen/builtins-ffs_parity_popcount.c +++ /dev/null @@ -1,15 +0,0 @@ -// RUN: clang-cc -emit-llvm -o - %s > %t -// RUN: not grep "__builtin" %t - -#include <stdio.h> - -void test(int M, long long N) { - printf("%d %lld: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", - M, N, - __builtin_ffs(M), __builtin_ffsl(M), __builtin_ffsll(M), - __builtin_parity(M), __builtin_parityl(M), __builtin_parityll(M), - __builtin_popcount(M), __builtin_popcountl(M), __builtin_popcountll(M), - __builtin_ffs(N), __builtin_ffsl(N), __builtin_ffsll(N), - __builtin_parity(N), __builtin_parityl(N), __builtin_parityll(N), - __builtin_popcount(N), __builtin_popcountl(N), __builtin_popcountll(N)); -} diff --git a/test/CodeGen/builtins-powi.c b/test/CodeGen/builtins-powi.c deleted file mode 100644 index 945ec5d..0000000 --- a/test/CodeGen/builtins-powi.c +++ /dev/null @@ -1,28 +0,0 @@ -// RUN: clang-cc -emit-llvm -o - %s > %t -// RUN: not grep "__builtin" %t - -#include <stdio.h> -#include <stdlib.h> - -void test(long double a, int b) { - printf("%Lf**%d: %08x %08x %016Lx\n", - a, b, - __builtin_powi(a, b), - __builtin_powif(a, b), - __builtin_powil(a, b) - ); -} - -int main() { - int i; - - test(-1,-1LL); - test(0,0); - test(1,1); - - for (i=0; i<3; i++) { - test(random(), i); - } - - return 0; -} diff --git a/test/CodeGen/const-init.c b/test/CodeGen/const-init.c index 06cdde9..5f196ca 100644 --- a/test/CodeGen/const-init.c +++ b/test/CodeGen/const-init.c @@ -1,6 +1,6 @@ -// RUN: clang-cc -triple i386-pc-linux-gnu -verify -emit-llvm -o - %s | FileCheck %s +// RUN: clang-cc -triple i386-pc-linux-gnu -ffreestanding -verify -emit-llvm -o - %s | FileCheck %s -typedef __INTPTR_TYPE__ intptr_t; +#include <stdint.h> // Brace-enclosed string array initializers char a[] = { "asdf" }; diff --git a/test/CodeGen/debug-info.c b/test/CodeGen/debug-info.c index 856b919..d7a54d6 100644 --- a/test/CodeGen/debug-info.c +++ b/test/CodeGen/debug-info.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -o %t --emit-llvm -g %s +// RUN: clang-cc -o %t -emit-llvm -g %s // RUN: FileCheck --input-file=%t %s // PR3023 diff --git a/test/CodeGen/flexible-array-init.c b/test/CodeGen/flexible-array-init.c index 2f0df90..bf8f057 100644 --- a/test/CodeGen/flexible-array-init.c +++ b/test/CodeGen/flexible-array-init.c @@ -1,8 +1,7 @@ -// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm -o - %s | grep 7 | count 1 -// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm -o - %s | grep 11 | count 1 -// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm -o - %s | grep 13 | count 1 -// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm -o - %s | grep 15 | count 1 +// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck %s struct { int x; int y[]; } a = { 1, 7, 11 }; +// CHECK: @a = global %0 { i32 1, [2 x i32] [i32 7, i32 11] } struct { int x; int y[]; } b = { 1, { 13, 15 } }; +// CHECK: @b = global %0 { i32 1, [2 x i32] [i32 13, i32 15] } diff --git a/test/CodeGen/func-return-member.c b/test/CodeGen/func-return-member.c index e6fc562..68a48fc 100644 --- a/test/CodeGen/func-return-member.c +++ b/test/CodeGen/func-return-member.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -emit-llvm < %s 2>&1 | not grep 'cannot codegen this l-value expression yet' +// RUN: clang-cc -emit-llvm -o - %s | FileCheck %s struct frk { float _Complex c; int x; }; struct faz { struct frk f; }; @@ -10,14 +10,17 @@ int X; struct frk F; float _Complex C; +// CHECK: define void @bar void bar(void) { X = foo().f.f.x; } +// CHECK: define void @bun void bun(void) { F = foo().f.f; } +// CHECK: define void @ban void ban(void) { C = foo().f.f.c; } diff --git a/test/CodeGen/incomplete-function-type.c b/test/CodeGen/incomplete-function-type.c index a641268..c760e04 100644 --- a/test/CodeGen/incomplete-function-type.c +++ b/test/CodeGen/incomplete-function-type.c @@ -1,4 +1,7 @@ -// RUN: clang-cc -emit-llvm %s -o - | not grep opaque +// RUN: clang-cc -emit-llvm -o - %s | FileCheck %s +// CHECK: ModuleID +// CHECK-NOT: opaque +// CHECK: define void @f0 enum teste1 test1f(void), (*test1)(void) = test1f; struct tests2 test2f(), (*test2)() = test2f; @@ -8,3 +11,4 @@ enum teste1 { TEST1 }; struct tests2 { int x,y,z,a,b,c,d,e,f,g; }; struct tests3 { float x; }; +void f0() {} diff --git a/test/CodeGen/rdr-6098585-default-after-caserange.c b/test/CodeGen/rdr-6098585-default-after-caserange.c index 239383a..2c58548 100644 --- a/test/CodeGen/rdr-6098585-default-after-caserange.c +++ b/test/CodeGen/rdr-6098585-default-after-caserange.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-unknown-unknown --emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t +// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t // RUN: grep "ret i32" %t | count 1 // RUN: grep "ret i32 10" %t | count 1 diff --git a/test/CodeGen/rdr-6098585-default-fallthrough-to-caserange.c b/test/CodeGen/rdr-6098585-default-fallthrough-to-caserange.c index 39a6bc6..257a9d7 100644 --- a/test/CodeGen/rdr-6098585-default-fallthrough-to-caserange.c +++ b/test/CodeGen/rdr-6098585-default-fallthrough-to-caserange.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-unknown-unknown --emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t +// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t // RUN: grep "ret i32 10" %t // Ensure that this doesn't compile to infinite loop in g() due to diff --git a/test/CodeGen/rdr-6098585-empty-case-range.c b/test/CodeGen/rdr-6098585-empty-case-range.c index f80b599..2dd1eaa 100644 --- a/test/CodeGen/rdr-6098585-empty-case-range.c +++ b/test/CodeGen/rdr-6098585-empty-case-range.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-unknown-unknown --emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t +// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t // RUN: grep "ret i32" %t | count 2 // RUN: grep "ret i32 3" %t | count 2 diff --git a/test/CodeGen/rdr-6098585-fallthrough-to-empty-range.c b/test/CodeGen/rdr-6098585-fallthrough-to-empty-range.c index 6c51a37..c12cf82 100644 --- a/test/CodeGen/rdr-6098585-fallthrough-to-empty-range.c +++ b/test/CodeGen/rdr-6098585-fallthrough-to-empty-range.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-unknown-unknown --emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t +// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t // RUN: grep "ret i32 %" %t // Make sure return is not constant (if empty range is skipped or miscompiled) diff --git a/test/CodeGen/rdr-6098585-unsigned-caserange.c b/test/CodeGen/rdr-6098585-unsigned-caserange.c index 3b4384b..a2b85d9 100644 --- a/test/CodeGen/rdr-6098585-unsigned-caserange.c +++ b/test/CodeGen/rdr-6098585-unsigned-caserange.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-unknown-unknown --emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t +// RUN: clang-cc -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t // RUN: grep "ret i32" %t | count 1 // RUN: grep "ret i32 3" %t | count 1 diff --git a/test/CodeGen/stack-protector.c b/test/CodeGen/stack-protector.c index c29d1f7..5763597 100644 --- a/test/CodeGen/stack-protector.c +++ b/test/CodeGen/stack-protector.c @@ -1,8 +1,8 @@ -// RUN: clang-cc -emit-llvm -o - %s -stack-protector=0 | FileCheck -check-prefix=NOSSP %s +// RUN: clang-cc -emit-llvm -o - %s -stack-protector 0 | FileCheck -check-prefix=NOSSP %s // NOSSP: define void @test1(i8* %msg) nounwind { -// RUN: clang-cc -emit-llvm -o - %s -stack-protector=1 | FileCheck -check-prefix=WITHSSP %s +// RUN: clang-cc -emit-llvm -o - %s -stack-protector 1 | FileCheck -check-prefix=WITHSSP %s // WITHSSP: define void @test1(i8* %msg) nounwind ssp { -// RUN: clang-cc -emit-llvm -o - %s -stack-protector=2 | FileCheck -check-prefix=SSPREQ %s +// RUN: clang-cc -emit-llvm -o - %s -stack-protector 2 | FileCheck -check-prefix=SSPREQ %s // SSPREQ: define void @test1(i8* %msg) nounwind sspreq { int printf(const char * _Format, ...); diff --git a/test/CodeGen/static-order.c b/test/CodeGen/static-order.c index 243e96b..58340b6 100644 --- a/test/CodeGen/static-order.c +++ b/test/CodeGen/static-order.c @@ -1,4 +1,7 @@ -// RUN: clang-cc -emit-llvm -o - %s | not grep "zeroinitializer" +// RUN: clang-cc -emit-llvm -o - %s | FileCheck %s +// CHECK: ModuleID +// CHECK-NOT: zeroinitializer +// CHECK: define i8* @f struct s { int a; diff --git a/test/CodeGen/switch.c b/test/CodeGen/switch.c index 3254fbf..96118f6 100644 --- a/test/CodeGen/switch.c +++ b/test/CodeGen/switch.c @@ -1,11 +1,11 @@ -// RUN: clang-cc %s -emit-llvm-bc -o - | opt -std-compile-opts -disable-output +// RUN: clang-cc -triple i386-unknown-unknown -O3 %s -emit-llvm -o - | FileCheck %s int foo(int i) { int j = 0; switch (i) { case -1: j = 1; break; - case 1 : + case 1 : j = 2; break; case 2: j = 3; break; @@ -16,11 +16,10 @@ int foo(int i) { return j; } - int foo2(int i) { int j = 0; switch (i) { - case 1 : + case 1 : j = 2; break; case 2 ... 10: j = 3; break; @@ -31,7 +30,6 @@ int foo2(int i) { return j; } - int foo3(int i) { int j = 0; switch (i) { @@ -48,7 +46,7 @@ int foo3(int i) { } -int foo4(int i) { +static int foo4(int i) { int j = 0; switch (i) { case 111: @@ -65,6 +63,17 @@ int foo4(int i) { return j; } +// CHECK: define i32 @foo4t() +// CHECK: ret i32 376 +// CHECK: } +int foo4t() { + // 111 + 1 + 222 + 42 = 376 + return foo4(111) + foo4(99) + foo4(222) + foo4(601); +} + +// CHECK: define void @foo5() +// CHECK-NOT: switch +// CHECK: } void foo5(){ switch(0){ default: @@ -74,11 +83,17 @@ void foo5(){ } } +// CHECK: define void @foo6() +// CHECK-NOT: switch +// CHECK: } void foo6(){ switch(0){ } } +// CHECK: define void @foo7() +// CHECK-NOT: switch +// CHECK: } void foo7(){ switch(0){ foo7(); diff --git a/test/CodeGen/vector.c b/test/CodeGen/vector.c index 2945eba..21a03d0 100644 --- a/test/CodeGen/vector.c +++ b/test/CodeGen/vector.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-apple-darwin9 -mcpu=pentium4 -g -emit-llvm %s -o - +// RUN: clang-cc -triple i386-apple-darwin9 -mcpu pentium4 -g -emit-llvm %s -o - typedef short __v4hi __attribute__ ((__vector_size__ (8))); void test1() { diff --git a/test/CodeGen/visibility.c b/test/CodeGen/visibility.c index 7c837ba..c19004a5 100644 --- a/test/CodeGen/visibility.c +++ b/test/CodeGen/visibility.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple i386-unknown-unknown -fvisibility=default -emit-llvm -o %t %s +// RUN: clang-cc -triple i386-unknown-unknown -fvisibility default -emit-llvm -o %t %s // RUN: grep '@g_com = common global i32 0' %t // RUN: grep '@g_def = global i32 0' %t // RUN: grep '@g_ext = external global i32' %t @@ -6,7 +6,7 @@ // RUN: grep 'declare void @f_ext()' %t // RUN: grep 'define internal void @f_deferred()' %t // RUN: grep 'define i32 @f_def()' %t -// RUN: clang-cc -triple i386-unknown-unknown -fvisibility=protected -emit-llvm -o %t %s +// RUN: clang-cc -triple i386-unknown-unknown -fvisibility protected -emit-llvm -o %t %s // RUN: grep '@g_com = common protected global i32 0' %t // RUN: grep '@g_def = protected global i32 0' %t // RUN: grep '@g_ext = external global i32' %t @@ -14,7 +14,7 @@ // RUN: grep 'declare void @f_ext()' %t // RUN: grep 'define internal void @f_deferred()' %t // RUN: grep 'define protected i32 @f_def()' %t -// RUN: clang-cc -triple i386-unknown-unknown -fvisibility=hidden -emit-llvm -o %t %s +// RUN: clang-cc -triple i386-unknown-unknown -fvisibility hidden -emit-llvm -o %t %s // RUN: grep '@g_com = common hidden global i32 0' %t // RUN: grep '@g_def = hidden global i32 0' %t // RUN: grep '@g_ext = external global i32' %t diff --git a/test/CodeGenCXX/condition.cpp b/test/CodeGenCXX/condition.cpp new file mode 100644 index 0000000..a6b74ef --- /dev/null +++ b/test/CodeGenCXX/condition.cpp @@ -0,0 +1,110 @@ +// RUN: clang-cc -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +void *f(); + +template <typename T> T* g() { + if (T* t = f()) + return t; + + return 0; +} + +void h() { + void *a = g<void>(); +} + +struct X { + X(); + ~X(); + operator bool(); +}; + +struct Y { + Y(); + ~Y(); +}; + +void if_destruct(int z) { + // Verify that the condition variable is destroyed at the end of the + // "if" statement. + // CHECK: call void @_ZN1XC1Ev + // CHECK: call zeroext i1 @_ZN1XcvbEv + if (X x = X()) { + // CHECK: store i32 18 + z = 18; + } + // CHECK: call void @_ZN1XD1Ev + // CHECK: store i32 17 + z = 17; + + // CHECK: call void @_ZN1XC1Ev + if (X x = X()) + Y y; + // CHECK: if.then + // CHECK: call void @_ZN1YC1Ev + // CHECK: call void @_ZN1YD1Ev + // CHECK: if.end + // CHECK: call void @_ZN1XD1Ev +} + +struct ConvertibleToInt { + ConvertibleToInt(); + ~ConvertibleToInt(); + operator int(); +}; + +void switch_destruct(int z) { + // CHECK: call void @_ZN16ConvertibleToIntC1Ev + switch (ConvertibleToInt conv = ConvertibleToInt()) { + case 0: + break; + + default: + // CHECK: sw.default: + // CHECK: store i32 19 + z = 19; + break; + } + // CHECK: sw.epilog: + // CHECK: call void @_ZN16ConvertibleToIntD1Ev + // CHECK: store i32 20 + z = 20; +} + +int foo(); + +void while_destruct(int z) { + // CHECK: define void @_Z14while_destructi + // CHECK: while.cond: + while (X x = X()) { + // CHECK: call void @_ZN1XC1Ev + + // CHECK: while.body: + // CHECK: store i32 21 + z = 21; + + // CHECK: while.cleanup: + // CHECK: call void @_ZN1XD1Ev + } + // CHECK: while.end + // CHECK: store i32 22 + z = 22; +} + +void for_destruct(int z) { + // CHECK: define void @_Z12for_destruct + // CHECK: call void @_ZN1YC1Ev + for(Y y = Y(); X x = X(); ++z) + // CHECK: for.cond: + // CHECK: call void @_ZN1XC1Ev + // CHECK: for.body: + // CHECK: store i32 23 + z = 23; + // CHECK: for.inc: + // CHECK: br label %for.cond.cleanup + // CHECK: for.cond.cleanup: + // CHECK: call void @_ZN1XD1Ev + // CHECK: for.end: + // CHECK: call void @_ZN1YD1Ev + // CHECK: store i32 24 + z = 24; +} diff --git a/test/CodeGenCXX/conditional-temporaries.cpp b/test/CodeGenCXX/conditional-temporaries.cpp new file mode 100644 index 0000000..f6c466a --- /dev/null +++ b/test/CodeGenCXX/conditional-temporaries.cpp @@ -0,0 +1,28 @@ +// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s + +struct I { + int i; + I(); + ~I(); +}; + +void g(int); + +volatile int i; + +void f1() { + // CHECK: call void @_ZN1IC1Ev + g(i ? I().i : 0); + // CHECK: call void @_Z1gi + // CHECK: call void @_ZN1ID1Ev + + // CHECK: call void @_ZN1IC1Ev + g(i || I().i); + // CHECK: call void @_Z1gi + // CHECK: call void @_ZN1ID1Ev + + // CHECK: call void @_ZN1IC1Ev + g(i && I().i); + // CHECK: call void @_Z1gi + // CHECK: call void @_ZN1ID1Ev +} diff --git a/test/CodeGenCXX/const-global-linkage.cpp b/test/CodeGenCXX/const-global-linkage.cpp new file mode 100644 index 0000000..f12c569 --- /dev/null +++ b/test/CodeGenCXX/const-global-linkage.cpp @@ -0,0 +1,13 @@ +// RUN: clang-cc -emit-llvm -o - %s | FileCheck %s + +const int x = 10; +const int y = 20; +// CHECK-NOT: @x +// CHECK: @y = internal constant i32 20 +const int& b() { return y; } + +const char z1[] = "asdf"; +const char z2[] = "zxcv"; +// CHECK-NOT: @z1 +// CHECK: @z2 = internal constant +const char* b2() { return z2; } diff --git a/test/CodeGenCXX/const-init.cpp b/test/CodeGenCXX/const-init.cpp index 427ba53..42da634 100644 --- a/test/CodeGenCXX/const-init.cpp +++ b/test/CodeGenCXX/const-init.cpp @@ -1,11 +1,26 @@ -// RUN: clang-cc -verify -emit-llvm -o %t %s +// RUN: clang-cc -verify -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck %s +// CHECK: @a = global i32 10 int a = 10; +// CHECK: @ar = global i32* @a int &ar = a; void f(); +// CHECK: @fr = global void ()* @_Z1fv void (&fr)() = f; struct S { int& a; }; +// CHECK: @s = global %0 { i32* @a } S s = { a }; +// PR5581 +namespace PR5581 { +class C { +public: + enum { e0, e1 }; + unsigned f; +}; + +// CHECK: @_ZN6PR55812g0E = global %1 { i32 1 } +C g0 = { C::e1 }; +} diff --git a/test/CodeGenCXX/copy-assign-synthesis-2.cpp b/test/CodeGenCXX/copy-assign-synthesis-2.cpp new file mode 100644 index 0000000..60d52f5 --- /dev/null +++ b/test/CodeGenCXX/copy-assign-synthesis-2.cpp @@ -0,0 +1,4 @@ +// RUN: clang-cc -emit-llvm %s -o - | FileCheck %s +struct A {}; +A& (A::*x)(const A&) = &A::operator=; +// CHECK: define linkonce_odr %struct.A* @_ZN1AaSERKS_ diff --git a/test/CodeGenCXX/copy-constructor-synthesis.cpp b/test/CodeGenCXX/copy-constructor-synthesis.cpp index 3b8f782..2e950eb 100644 --- a/test/CodeGenCXX/copy-constructor-synthesis.cpp +++ b/test/CodeGenCXX/copy-constructor-synthesis.cpp @@ -102,6 +102,17 @@ int main() { m1.pr(); } +struct A { +}; + +struct B : A { + A &a; +}; + +void f(const B &b1) { + B b2(b1); +} + // CHECK-LP64: .globl __ZN1XC1ERKS_ // CHECK-LP64: .weak_definition __ZN1XC1ERKS_ // CHECK-LP64: __ZN1XC1ERKS_: diff --git a/test/CodeGenCXX/default-arguments.cpp b/test/CodeGenCXX/default-arguments.cpp index 5028ce9..71d4baa 100644 --- a/test/CodeGenCXX/default-arguments.cpp +++ b/test/CodeGenCXX/default-arguments.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin10 +// RUN: clang-cc %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s // PR5484 namespace PR5484 { @@ -11,3 +11,59 @@ void g() { f(); } } + +struct A1 { + A1(); + ~A1(); +}; + +struct A2 { + A2(); + ~A2(); +}; + +struct B { + B(const A1& = A1(), const A2& = A2()); +}; + +// CHECK: define void @_Z2f1v() +void f1() { + + // CHECK: call void @_ZN2A1C1Ev( + // CHECK: call void @_ZN2A2C1Ev( + // CHECK: call void @_ZN1BC1ERK2A1RK2A2( + // CHECK: call void @_ZN2A2D1Ev + // CHECK: call void @_ZN2A1D1Ev + B bs[2]; +} + +struct C { + B bs[2]; + C(); +}; + +// CHECK: define void @_ZN1CC1Ev( +// CHECK: call void @_ZN2A1C1Ev( +// CHECK: call void @_ZN2A2C1Ev( +// CHECK: call void @_ZN1BC1ERK2A1RK2A2( +// CHECK: call void @_ZN2A2D1Ev +// CHECK: call void @_ZN2A1D1Ev + +// CHECK: define void @_ZN1CC2Ev( +// CHECK: call void @_ZN2A1C1Ev( +// CHECK: call void @_ZN2A2C1Ev( +// CHECK: call void @_ZN1BC1ERK2A1RK2A2( +// CHECK: call void @_ZN2A2D1Ev +// CHECK: call void @_ZN2A1D1Ev +C::C() { } + +// CHECK: define void @_Z2f3v() +void f3() { + // CHECK: call void @_ZN2A1C1Ev( + // CHECK: call void @_ZN2A2C1Ev( + // CHECK: call void @_ZN1BC1ERK2A1RK2A2( + // CHECK: call void @_ZN2A2D1Ev + // CHECK: call void @_ZN2A1D1Ev + B *bs = new B[2]; + delete bs; +} diff --git a/test/CodeGenCXX/dyncast.cpp b/test/CodeGenCXX/dyncast.cpp index 4719f80..0f78fb0 100644 --- a/test/CodeGenCXX/dyncast.cpp +++ b/test/CodeGenCXX/dyncast.cpp @@ -97,7 +97,7 @@ void test1() { // CHECK-LL-NEXT: br i1 %4, label %5, label %9 // CHECK-LL: ; <label>:5 // CHECK-LL-NEXT: %6 = bitcast %class.test1_A* %tmp to i8* -// CHECK-LL-NEXT: %7 = call i8* @__dynamic_cast(i8* %6, i8* bitcast (i8** @_ZTI7test1_B to i8*), i8* bitcast (i8** @_ZTI7test1_D to i8*), i64 -1) +// CHECK-LL-NEXT: %7 = call i8* @__dynamic_cast(i8* %6, i8* bitcast ({{.*}} @_ZTI7test1_B to i8*), i8* bitcast (i8** @_ZTI7test1_D to i8*), i64 -1) // CHECK-LL-NEXT: %8 = bitcast i8* %7 to %class.test1_D* // CHECK-LL-NEXT: br label %10 // CHECK-LL: ; <label>:9 @@ -120,7 +120,7 @@ void test1() { // CHECK-LL-NEXT: br i1 %12, label %13, label %17 // CHECK-LL: ; <label>:13 // CHECK-LL-NEXT: %14 = bitcast %class.test1_A* %tmp6 to i8* -// CHECK-LL-NEXT: %15 = call i8* @__dynamic_cast(i8* %14, i8* bitcast (i8** @_ZTI7test1_B to i8*), i8* bitcast (i8** @_ZTI7test1_A to i8*), i64 -1) +// CHECK-LL-NEXT: %15 = call i8* @__dynamic_cast(i8* %14, i8* bitcast ({{.*}} @_ZTI7test1_B to i8*), i8* bitcast ({{.*}} @_ZTI7test1_A to i8*), i64 -1) // CHECK-LL-NEXT: %16 = bitcast i8* %15 to %class.test1_A* // CHECK-LL-NEXT: br label %18 // CHECK-LL: ; <label>:17 @@ -143,7 +143,7 @@ void test1() { // CHECK-LL-NEXT: br i1 %20, label %21, label %25 // CHECK-LL: ; <label>:21 // CHECK-LL-NEXT: %22 = bitcast %class.test1_A* %tmp14 to i8* -// CHECK-LL-NEXT: %23 = call i8* @__dynamic_cast(i8* %22, i8* bitcast (i8** @_ZTI7test1_A to i8*), i8* bitcast (i8** @_ZTI7test1_B to i8*), i64 -1) +// CHECK-LL-NEXT: %23 = call i8* @__dynamic_cast({{.*}} %22, i8* bitcast ({{.*}} @_ZTI7test1_A to i8*), i8* bitcast ({{.*}} @_ZTI7test1_B to i8*), i64 -1) // CHECK-LL-NEXT: %24 = bitcast i8* %23 to %class.test1_A* // CHECK-LL-NEXT: br label %26 // CHECK-LL: ; <label>:25 @@ -214,7 +214,7 @@ void test1() { // CHECK-LL-NEXT: br i1 %34, label %35, label %39 // CHECK-LL: ; <label>:35 // CHECK-LL-NEXT: %36 = bitcast %class.test1_A* %tmp54 to i8* -// CHECK-LL-NEXT: %37 = call i8* @__dynamic_cast(i8* %36, i8* bitcast (i8** @_ZTI7test1_A to i8*), i8* bitcast (i8** @_ZTI7test1_D to i8*), i64 -1) +// CHECK-LL-NEXT: %37 = call i8* @__dynamic_cast(i8* %36, i8* bitcast ({{.*}} @_ZTI7test1_A to i8*), i8* bitcast ({{.*}} @_ZTI7test1_D to i8*), i64 -1) // CHECK-LL-NEXT: %38 = bitcast i8* %37 to %class.test1_D* // CHECK-LL-NEXT: br label %40 // CHECK-LL: ; <label>:39 @@ -237,7 +237,7 @@ void test1() { // CHECK-LL-NEXT: br i1 %42, label %43, label %47 // CHECK-LL: ; <label>:43 // CHECK-LL-NEXT: %44 = bitcast %class.test1_A* %tmp63 to i8* -// CHECK-LL-NEXT: %45 = call i8* @__dynamic_cast(i8* %44, i8* bitcast (i8** @_ZTI7test1_A to i8*), i8* bitcast (i8** @_ZTI7test1_E to i8*), i64 -1) +// CHECK-LL-NEXT: %45 = call i8* @__dynamic_cast(i8* %44, i8* bitcast ({{.*}} @_ZTI7test1_A to i8*), i8* bitcast ({{.*}} @_ZTI7test1_E to i8*), i64 -1) // CHECK-LL-NEXT: %46 = bitcast i8* %45 to %class.test1_E* // CHECK-LL-NEXT: br label %48 // CHECK-LL: ; <label>:47 @@ -279,7 +279,7 @@ void test1() { // CHECK-LL: if.end85: // CHECK-LL-NEXT: br i1 false, label %50, label %53 // CHECK-LL: ; <label>:50 -// CHECK-LL-NEXT: %51 = call i8* @__dynamic_cast(i8* null, i8* bitcast (i8** @_ZTI7test1_A to i8*), i8* bitcast (i8** @_ZTI7test1_D to i8*), i64 -1) +// CHECK-LL-NEXT: %51 = call i8* @__dynamic_cast(i8* null, i8* bitcast ({{.*}}* @_ZTI7test1_A to i8*), i8* bitcast ({{.*}} @_ZTI7test1_D to i8*), i64 -1) // CHECK-LL-NEXT: %52 = bitcast i8* %51 to %class.test1_D* // CHECK-LL-NEXT: br label %54 // CHECK-LL: ; <label>:53 diff --git a/test/CodeGenCXX/eh.cpp b/test/CodeGenCXX/eh.cpp new file mode 100644 index 0000000..3dd7219 --- /dev/null +++ b/test/CodeGenCXX/eh.cpp @@ -0,0 +1,68 @@ +// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s + +struct test1_D { + double d; +} d1; + +void test1() { + throw d1; +} + +// CHECK: define void @_Z5test1v() nounwind { +// CHECK-NEXT:entry: +// CHECK-NEXT: %exception = call i8* @__cxa_allocate_exception(i64 8) +// CHECK-NEXT: %0 = bitcast i8* %exception to %struct.test1_D* +// CHECK-NEXT: %tmp = bitcast %struct.test1_D* %0 to i8* +// CHECK-NEXT: call void @llvm.memcpy.i64(i8* %tmp, i8* bitcast (%struct.test1_D* @d1 to i8*), i64 8, i32 8) +// CHECK-NEXT: call void @__cxa_throw(i8* %exception, i8* bitcast (%0* @_ZTI7test1_D to i8*), i8* null) noreturn +// CHECK-NEXT: unreachable + + +struct test2_D { + test2_D(const test2_D&o); + test2_D(); + virtual void bar() { } + int i; int j; +} d2; + +void test2() { + throw d2; +} + +// CHECK: define void @_Z5test2v() nounwind { +// CHECK-NEXT:entry: +// CHECK-NEXT: %exception = call i8* @__cxa_allocate_exception(i64 16) +// CHECK-NEXT: %0 = bitcast i8* %exception to %struct.test2_D* +// CHECK-NEXT: call void @_ZN7test2_DC1ERKS_(%struct.test2_D* %0, %struct.test2_D* @d2) +// CHECK-NEXT: call void @__cxa_throw(i8* %exception, i8* bitcast (%0* @_ZTI7test2_D to i8*), i8* null) noreturn +// CHECK-NEXT: unreachable + + +struct test3_D { + test3_D() { } + test3_D(volatile test3_D&o); + virtual void bar(); +}; + +void test3() { + throw (volatile test3_D *)0; +} + +// CHECK: define void @_Z5test3v() nounwind { +// CHECK-NEXT: entry: +// CHECK-NEXT: %exception = call i8* @__cxa_allocate_exception(i64 8) +// CHECK-NEXT: %0 = bitcast i8* %exception to %struct.test3_D** +// CHECK-NEXT: store %struct.test3_D* null, %struct.test3_D** %0 +// CHECK-NEXT: call void @__cxa_throw(i8* %exception, i8* bitcast (%1* @_ZTIPV7test3_D to i8*), i8* null) noreturn +// CHECK-NEXT: unreachable + + +void test4() { + throw; +} + +// CHECK: define void @_Z5test4v() nounwind { +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @__cxa_rethrow() noreturn +// CHECK-NEXT: unreachable diff --git a/test/CodeGenCXX/mangle-template.cpp b/test/CodeGenCXX/mangle-template.cpp new file mode 100644 index 0000000..32ce33d --- /dev/null +++ b/test/CodeGenCXX/mangle-template.cpp @@ -0,0 +1,68 @@ +// RUN: clang-cc -emit-llvm -o - %s | FileCheck %s + +namespace test1 { +int x; +template <int& D> class T { }; +// CHECK: void @_ZN5test12f0ENS_1TILZNS_1xEEEE( +void f0(T<x> a0) {} +} + +namespace test1 { +// CHECK: void @_ZN5test12f0Ef +void f0(float) {} +template<void (&)(float)> struct t1 {}; +// CHECK: void @_ZN5test12f1ENS_2t1ILZNS_2f0EfEEE( +void f1(t1<f0> a0) {} +} + +namespace test2 { +// CHECK: void @_ZN5test22f0Ef +void f0(float) {} +template<void (*)(float)> struct t1 {}; +// FIXME: Fails because we don't treat as an expression. +// CHECK-FIXME: void @_ZN5test22f1ENS_2t1IXadL_ZNS_2f0EfEEEE( +void f1(t1<f0> a0) {} +} + +namespace test3 { +// CHECK: void @test3_f0 +extern "C" void test3_f0(float) {} +template<void (&)(float)> struct t1 {}; +// FIXME: Fails because we tack on a namespace. +// CHECK-FIXME: void @_ZN5test32f1ENS_2t1ILZ8test3_f0EEE( +void f1(t1<test3_f0> a0) {} +} + +namespace test4 { +// CHECK: void @test4_f0 +extern "C" void test4_f0(float) {} +template<void (*)(float)> struct t1 {}; +// FIXME: Fails because we don't treat as an expression. +// CHECK-FIXME: void @_ZN5test42f1ENS_2t1IXadL_Z8test4_f0EEEE( +void f1(t1<test4_f0> a0) {} +} + +// CHECK: void @test5_f0 +extern "C" void test5_f0(float) {} +int main(int) {} + +namespace test5 { +template<void (&)(float)> struct t1 {}; +// CHECK: void @_ZN5test52f1ENS_2t1ILZ8test5_f0EEE( +void f1(t1<test5_f0> a0) {} + +template<int (&)(int)> struct t2 {}; +// CHECK: void @_ZN5test52f2ENS_2t2ILZ4mainEEE +void f2(t2<main> a0) {} +} + +// FIXME: This fails. +namespace test6 { +struct A { void im0(float); }; +// CHECK: void @_ZN5test61A3im0Ef +void A::im0(float) {} +template <void(A::*)(float)> class T { }; +// FIXME: Fails because we don't treat as an expression. +// CHECK-FAIL: void @_ZN5test62f0ENS_1TIXadL_ZNS_1A3im0EfEEEE( +void f0(T<&A::im0> a0) {} +} diff --git a/test/CodeGenCXX/member-expressions.cpp b/test/CodeGenCXX/member-expressions.cpp index f90b807..a38d5f9 100644 --- a/test/CodeGenCXX/member-expressions.cpp +++ b/test/CodeGenCXX/member-expressions.cpp @@ -17,3 +17,30 @@ void f() } } + +struct A { + A(); + ~A(); + enum E { Foo }; +}; + +A *g(); + +void f(A *a) { + A::E e1 = a->Foo; + + // CHECK: call %struct.A* @_Z1gv() + A::E e2 = g()->Foo; + // CHECK: call void @_ZN1AC1Ev( + // CHECK: call void @_ZN1AD1Ev( + A::E e3 = A().Foo; +} + +namespace test3 { +struct A { + static int foo(); +}; +int f() { + return A().foo(); +} +} diff --git a/test/CodeGenCXX/member-function-pointers.cpp b/test/CodeGenCXX/member-function-pointers.cpp index 7792560..05bf396 100644 --- a/test/CodeGenCXX/member-function-pointers.cpp +++ b/test/CodeGenCXX/member-function-pointers.cpp @@ -34,6 +34,11 @@ void f() { // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = add i64 {{.*}}, 16 // CHECK: store i64 [[ADJ]], i64* getelementptr inbounds (%0* @pc, i32 0, i32 1) pc = pa; + + // CHECK: store i64 {{.*}}, i64* getelementptr inbounds (%0* @pa, i32 0, i32 0) + // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = sub i64 {{.*}}, 16 + // CHECK: store i64 [[ADJ]], i64* getelementptr inbounds (%0* @pa, i32 0, i32 1) + pa = static_cast<void (A::*)()>(pc); } void f2() { @@ -55,6 +60,10 @@ void f3(A *a, A &ar) { (ar.*pa)(); } +bool f4() { + return pa; +} + // PR5177 namespace PR5177 { struct A { @@ -87,3 +96,12 @@ namespace PR5138 { void (foo::*ptr3)(void) = (void (foo::*)(void))&foo::bar; } + +// PR5593 +namespace PR5593 { + struct A { }; + + bool f(void (A::*f)()) { + return f && f; + } +} diff --git a/test/CodeGenCXX/member-pointer-cast.cpp b/test/CodeGenCXX/member-pointer-cast.cpp new file mode 100644 index 0000000..7949968 --- /dev/null +++ b/test/CodeGenCXX/member-pointer-cast.cpp @@ -0,0 +1,21 @@ +// RUN: clang-cc %s -emit-llvm -o - -triple=x86_64-apple-darwin9 | FileCheck %s + +struct A { int a; }; +struct B { int b; }; +struct C : B, A { }; + +int A::*pa; +int C::*pc; + +void f() { + // CHECK: store i64 -1, i64* @pa + pa = 0; + + // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = add i64 {{.*}}, 4 + // CHECK: store i64 [[ADJ]], i64* @pc + pc = pa; + + // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = sub i64 {{.*}}, 4 + // CHECK: store i64 [[ADJ]], i64* @pa + pa = static_cast<int A::*>(pc); +} diff --git a/test/CodeGenCXX/member-templates.cpp b/test/CodeGenCXX/member-templates.cpp new file mode 100644 index 0000000..c8494c4 --- /dev/null +++ b/test/CodeGenCXX/member-templates.cpp @@ -0,0 +1,31 @@ +// RUN: clang-cc %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s + +// CHECK: ; ModuleID +struct A { + template<typename T> + A(T); +}; + +template<typename T> A::A(T) {} + +struct B { + template<typename T> + B(T); +}; + +template<typename T> B::B(T) {} + +// CHECK: define void @_ZN1BC1IiEET_(%struct.B* %this, i32) +// CHECK: define void @_ZN1BC2IiEET_(%struct.B* %this, i32) +template B::B(int); + +template<typename T> +struct C { + void f() { + int a[] = { 1, 2, 3 }; + } +}; + +void f(C<int>& c) { + c.f(); +} diff --git a/test/CodeGenCXX/new-with-default-arg.cpp b/test/CodeGenCXX/new-with-default-arg.cpp new file mode 100644 index 0000000..b73b7f08 --- /dev/null +++ b/test/CodeGenCXX/new-with-default-arg.cpp @@ -0,0 +1,33 @@ +// RUN: clang-cc -emit-llvm -o - %s +// pr5547 + +struct A { + void* operator new(__typeof(sizeof(int))); + A(); +}; + +A* x() { + return new A; +} + +struct B { + void* operator new(__typeof(sizeof(int)), int = 1, int = 4); + B(float); +}; + +B* y() { + new (3,4) B(1); + return new(1) B(2); +} + +struct C { + void* operator new(__typeof(sizeof(int)), int, int = 4); + C(); +}; + +C* z() { + new (3,4) C; + return new(1) C; +} + + diff --git a/test/CodeGenCXX/new.cpp b/test/CodeGenCXX/new.cpp index 3f191de..13f26b2 100644 --- a/test/CodeGenCXX/new.cpp +++ b/test/CodeGenCXX/new.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc %s -emit-llvm -o - | FileCheck %s +// RUN: clang-cc -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s #include <stddef.h> void t1() { @@ -72,3 +72,21 @@ void t8(int n) { new U[10]; new U[n]; } + +void t9() { + bool b; + + new bool(true); + new (&b) bool(true); +} + +struct A { + void* operator new(__typeof(sizeof(int)), int, float, ...); + A(); +}; + +A* t10() { + // CHECK: @_ZN1AnwEmifz + return new(1, 2, 3.45, 100) A; +} + diff --git a/test/CodeGenCXX/references.cpp b/test/CodeGenCXX/references.cpp index 8e0e1cb..eaaf346 100644 --- a/test/CodeGenCXX/references.cpp +++ b/test/CodeGenCXX/references.cpp @@ -136,3 +136,8 @@ void f(int &a) { (a = 10) = 20; } } + +// PR5590 +struct s0; +struct s1 { struct s0 &s0; }; +void f0(s1 a) { s1 b = a; } diff --git a/test/CodeGenCXX/temp-1.cpp b/test/CodeGenCXX/temp-1.cpp deleted file mode 100644 index 9b97f00..0000000 --- a/test/CodeGenCXX/temp-1.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// RUN: clang-cc -emit-llvm %s -o %t -triple=x86_64-apple-darwin9 && -struct A { - A(); - ~A(); - void f(); -}; - -// RUN: grep "call void @_ZN1AC1Ev" %t | count 2 && -// RUN: grep "call void @_ZN1AD1Ev" %t | count 2 && -void f1() { - (void)A(); - A().f(); -} - -// Function calls -struct B { - B(); - ~B(); -}; - -B g(); - -// RUN: grep "call void @_ZN1BC1Ev" %t | count 0 && -// RUN: grep "call void @_ZN1BD1Ev" %t | count 1 && -void f2() { - (void)g(); -} - -// Member function calls -struct C { - C(); - ~C(); - - C f(); -}; - -// RUN: grep "call void @_ZN1CC1Ev" %t | count 1 && -// RUN: grep "call void @_ZN1CD1Ev" %t | count 2 && -void f3() { - C().f(); -} - -// Function call operator -struct D { - D(); - ~D(); - - D operator()(); -}; - -// RUN: grep "call void @_ZN1DC1Ev" %t | count 1 && -// RUN: grep "call void @_ZN1DD1Ev" %t | count 2 && -void f4() { - D()(); -} - -// Overloaded operators -struct E { - E(); - ~E(); - E operator+(const E&); - E operator!(); -}; - -// RUN: grep "call void @_ZN1EC1Ev" %t | count 3 && -// RUN: grep "call void @_ZN1ED1Ev" %t | count 5 && -void f5() { - E() + E(); - !E(); -} - -struct F { - F(); - ~F(); - F& f(); -}; - -// RUN: grep "call void @_ZN1FC1Ev" %t | count 1 && -// RUN: grep "call void @_ZN1FD1Ev" %t | count 1 -void f6() { - F().f(); -} - diff --git a/test/CodeGenCXX/temp-order.cpp b/test/CodeGenCXX/temp-order.cpp new file mode 100644 index 0000000..ecf075f --- /dev/null +++ b/test/CodeGenCXX/temp-order.cpp @@ -0,0 +1,199 @@ +// Output file should have no calls to error() with folding. +// RUN: clang-cc -triple i386-unknown-unknown -O3 -emit-llvm -o %t %s +// RUN: FileCheck %s < %t + +static unsigned pow(unsigned Base, unsigned Power) { + unsigned Val = 1; + while (Power--) + Val *= Base; + return Val; +} + +struct TempTracker { + unsigned Product, Index; + + TempTracker() : Product(1), Index(0) {} + +}; + +// FIXME: This can be used to check elision as well, if P = 0 hacks are removed. +struct A { + TempTracker &TT; + mutable unsigned P; + bool Truth; + + A(TempTracker &_TT, unsigned _P, bool _Truth = true) + : TT(_TT), P(_P), Truth(_Truth) {} + A(const A &RHS) : TT(RHS.TT), P(RHS.P), Truth(RHS.Truth) { RHS.P = 0; } + ~A() { + if (P) + TT.Product *= pow(P, ++TT.Index); + } + + A &operator=(const A &RHS) { + TT = RHS.TT; + P = RHS.P; + Truth = RHS.Truth; + RHS.P = 0; + return *this; + } + + operator bool () { return Truth; } +}; + +// 3, 7, 2 +static unsigned f0(bool val = false) { + TempTracker tt; + { + A a(tt, 2); + if ((A(tt, 3), val)) + A b(tt, 5); + A c(tt, 7); + } + return tt.Product; +} + +// 3, 5, 7, 2 +static unsigned f1(bool val = true) { + TempTracker tt; + { + A a(tt, 2); + if ((A(tt, 3), val)) + A b(tt, 5); + A c(tt, 7); + } + return tt.Product; +} + +// 5, 3, 7, 2 +static unsigned f2() { + TempTracker tt; + { + A a(tt, 2); + if (A b = A(tt, 3)) + A c(tt, 5); + A d(tt, 7); + } + return tt.Product; +} + +// 7, 3, 11, 2 +static unsigned f3() { + TempTracker tt; + { + A a(tt, 2); + if (A b = A(tt, 3, false)) + A c(tt, 5); + else + A c(tt, 7); + A d(tt, 11); + } + return tt.Product; +} + +// 3, 7, 2 +static unsigned f4() { + TempTracker tt; + { + A a(tt, 2); + while (A b = A(tt, 3, false)) + A c(tt, 5); + A c(tt, 7); + } + return tt.Product; +} + +// 5, 3, 7, 2 +static unsigned f5() { + TempTracker tt; + { + A a(tt, 2); + while (A b = A(tt, 3, true)) { + A c(tt, 5); + break; + } + A c(tt, 7); + } + return tt.Product; +} + +// 3, 7, 11, 5, 13, 2 +static unsigned f6() { + TempTracker tt; + { + A a(tt, 2); + for (A b = (A(tt, 3), A(tt, 5)), c = (A(tt, 7), A(tt, 11));;) + break; + A c(tt, 13); + } + return tt.Product; +} + +extern "C" void error(); +extern "C" void print(const char *Name, unsigned N); + +#define ORDER3(a, b, c) (pow(a, 1) * pow(b, 2) * pow(c, 3)) +#define ORDER4(a, b, c, d) (ORDER3(a, b, c) * pow(d, 4)) +#define ORDER5(a, b, c, d, e) (ORDER4(a, b, c, d) * pow(e, 5)) +#define ORDER6(a, b, c, d, e, f) (ORDER5(a, b, c, d, e) * pow(f, 6)) +void test() { +// CHECK: call void @print(i8* {{.*}}, i32 1176) + print("f0", f0()); + if (f0() != ORDER3(3, 7, 2)) + error(); + +// CHECK: call void @print(i8* {{.*}}, i32 411600) + print("f1", f1()); + if (f1() != ORDER4(3, 5, 7, 2)) + error(); + +// CHECK: call void @print(i8* {{.*}}, i32 246960) + print("f2", f2()); + if (f2() != ORDER4(5, 3, 7, 2)) + error(); + +// CHECK: call void @print(i8* {{.*}}, i32 1341648) + print("f3", f3()); + if (f3() != ORDER4(7, 3, 11, 2)) + error(); + +// CHECK: call void @print(i8* {{.*}}, i32 1176) + print("f4", f4()); + if (f4() != ORDER3(3, 7, 2)) + error(); + +// CHECK: call void @print(i8* {{.*}}, i32 246960) + print("f5", f5()); + if (f5() != ORDER4(5, 3, 7, 2)) + error(); + +// FIXME: Clang/LLVM currently can't fold this to a constant. If the error check +// is present (since it avoids single-caller inlining). PR5645. + +// CHECK: call void @print(i8* {{.*}}, i32 1251552576) + print("f6", f6()); +// if (f6() != ORDER6(3, 7, 11, 5, 13, 2)) +// error(); +} + + + +#ifdef HARNESS + +#include <cstdlib> +#include <cstdio> + +extern "C" void error() { + abort(); +} + +extern "C" void print(const char *name, unsigned N) { + printf("%s: %d\n", name, N); +} + +int main() { + test(); + return 0; +} + +#endif diff --git a/test/CodeGenCXX/virt-dtor-key.cpp b/test/CodeGenCXX/virt-dtor-key.cpp new file mode 100644 index 0000000..30f3563 --- /dev/null +++ b/test/CodeGenCXX/virt-dtor-key.cpp @@ -0,0 +1,9 @@ +// RUN: clang-cc -emit-llvm %s -o - | FileCheck %s +// CHECK: @_ZTI3foo = linkonce_odr constant +class foo { + foo(); + virtual ~foo(); +}; + +foo::~foo() { +} diff --git a/test/CodeGenCXX/virt.cpp b/test/CodeGenCXX/virt.cpp index b453ed5..7135aaf 100644 --- a/test/CodeGenCXX/virt.cpp +++ b/test/CodeGenCXX/virt.cpp @@ -4,6 +4,11 @@ // RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -emit-llvm %s -o %t-64.ll // RUN: FileCheck -check-prefix LPLL64 --input-file=%t-64.ll %s + +// CHECK-LP64: main: +// CHECK-LP64: movl $1, 12(%rax) +// CHECK-LP64: movl $2, 8(%rax) + struct B { virtual void bar1(); virtual void bar2(); @@ -12,6 +17,12 @@ struct B { void B::bar1() { } void B::bar2() { } +// CHECK-LP64: __ZTV1B: +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .quad __ZTI1B +// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev +// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev + struct C { virtual void bee1(); virtual void bee2(); @@ -41,6 +52,28 @@ public: }; void F::foo() { } +// CHECK-LP64: __ZTV1F: +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .quad 16 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .quad __ZTI1F +// CHECK-LP64-NEXT: .quad __ZN1D3booEv +// CHECK-LP64-NEXT: .quad __ZN1F3fooEv +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .quad 18446744073709551600 +// CHECK-LP64-NEXT: .quad __ZTI1F +// CHECK-LP64-NEXT: .quad __ZN2D13barEv +// CHECK-LP64-NEXT: .quad __ZN2D14bar2Ev +// CHECK-LP64-NEXT: .quad __ZN2D14bar3Ev +// CHECK-LP64-NEXT: .quad __ZN2D14bar4Ev +// CHECK-LP64-NEXT: .quad __ZN2D14bar5Ev + + int j; void *vp; void test2() { @@ -79,9 +112,18 @@ int main() { ap->b = 2; } -// CHECK-LP64: main: -// CHECK-LP64: movl $1, 12(%rax) -// CHECK-LP64: movl $2, 8(%rax) +// CHECK-LP64: __ZTV1A: +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .quad __ZTI1A +// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev +// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev +// CHECK-LP64-NEXT: .quad __ZN1A4foo1Ev +// CHECK-LP64-NEXT: .quad __ZN1A4foo2Ev +// CHECK-LP64-NEXT: .quad 18446744073709551600 +// CHECK-LP64-NEXT: .quad __ZTI1A +// CHECK-LP64-NEXT: .quad __ZN1C4bee1Ev +// CHECK-LP64-NEXT: .quad __ZN1C4bee2Ev + struct test12_A { virtual void foo0() { } @@ -675,12 +717,10 @@ virtual void foo_B2() { } }; struct test16_D : test16_NV1, virtual test16_B2 { - virtual void bar(); - virtual test16_D *foo1(); + virtual void bar() { } + virtual test16_D *foo1() { return 0; } }; -void test16_D::bar() { } - // CHECK-LP64: __ZTV8test16_D: // CHECK-LP64-NEXT: .quad 32 // CHECK-LP64-NEXT: .quad 16 @@ -1040,45 +1080,6 @@ class test21_D : public test21_B, public test21_B1 { -// CHECK-LP64: __ZTV1B: -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .quad __ZTI1B -// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev -// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev - -// CHECK-LP64: __ZTV1A: -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .quad __ZTI1A -// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev -// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev -// CHECK-LP64-NEXT: .quad __ZN1A4foo1Ev -// CHECK-LP64-NEXT: .quad __ZN1A4foo2Ev -// CHECK-LP64-NEXT: .quad 18446744073709551600 -// CHECK-LP64-NEXT: .quad __ZTI1A -// CHECK-LP64-NEXT: .quad __ZN1C4bee1Ev -// CHECK-LP64-NEXT: .quad __ZN1C4bee2Ev - -// CHECK-LP64: __ZTV1F: -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .quad 16 -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .quad __ZTI1F -// CHECK-LP64-NEXT: .quad __ZN1D3booEv -// CHECK-LP64-NEXT: .quad __ZN1F3fooEv -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .space 8 -// CHECK-LP64-NEXT: .quad 18446744073709551600 -// CHECK-LP64-NEXT: .quad __ZTI1F -// CHECK-LP64-NEXT: .quad __ZN2D13barEv -// CHECK-LP64-NEXT: .quad __ZN2D14bar2Ev -// CHECK-LP64-NEXT: .quad __ZN2D14bar3Ev -// CHECK-LP64-NEXT: .quad __ZN2D14bar4Ev -// CHECK-LP64-NEXT: .quad __ZN2D14bar5Ev - test21_D d21; test20_D d20; test19_D d19; diff --git a/test/CodeGenCXX/virtual-base-cast.cpp b/test/CodeGenCXX/virtual-base-cast.cpp index a825120..eae868f 100644 --- a/test/CodeGenCXX/virtual-base-cast.cpp +++ b/test/CodeGenCXX/virtual-base-cast.cpp @@ -1,9 +1,33 @@ -// RUN: clang-cc -emit-llvm-only %s +// RUN: clang-cc -emit-llvm %s -o - -triple i686-pc-linux-gnu | FileCheck %s -struct A { virtual ~A(); }; -struct B : A { virtual ~B(); }; -struct C : virtual B { virtual ~C(); }; +struct A { int a; virtual int aa(); }; +struct B { int b; virtual int bb(); }; +struct C : virtual A, virtual B { int c; virtual int aa(); virtual int bb(); }; +struct AA { int a; virtual int aa(); }; +struct BB { int b; virtual int bb(); }; +struct CC : AA, BB { virtual int aa(); virtual int bb(); virtual int cc(); }; +struct D : virtual C, virtual CC { int e; }; -void f(C *c) { - A* a = c; -} +D* x; + +A* a() { return x; } +// CHECK: @_Z1av() nounwind +// CHECK: [[VBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = getelementptr i8* {{.*}}, i64 -16 +// CHECK: [[CASTVBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = bitcast i8* [[VBASEOFFSETPTRA]] to i32* +// CHECK: load i32* [[CASTVBASEOFFSETPTRA]] +// CHECK: } + +B* b() { return x; } +// CHECK: @_Z1bv() nounwind +// CHECK: [[VBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = getelementptr i8* {{.*}}, i64 -20 +// CHECK: [[CASTVBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = bitcast i8* [[VBASEOFFSETPTRA]] to i32* +// CHECK: load i32* [[CASTVBASEOFFSETPTRA]] +// CHECK: } + +BB* c() { return x; } +// CHECK: @_Z1cv() nounwind +// CHECK: [[VBASEOFFSETPTRC:%[a-zA-Z0-9\.]+]] = getelementptr i8* {{.*}}, i64 -24 +// CHECK: [[CASTVBASEOFFSETPTRC:%[a-zA-Z0-9\.]+]] = bitcast i8* [[VBASEOFFSETPTRC]] to i32* +// CHECK: [[VBASEOFFSETC:%[a-zA-Z0-9\.]+]] = load i32* [[CASTVBASEOFFSETPTRC]] +// CHECK: add i32 [[VBASEOFFSETC]], 8 +// CHECK: } diff --git a/test/CodeGenCXX/virtual-base-destructor-call.cpp b/test/CodeGenCXX/virtual-base-destructor-call.cpp new file mode 100644 index 0000000..e791758 --- /dev/null +++ b/test/CodeGenCXX/virtual-base-destructor-call.cpp @@ -0,0 +1,19 @@ +// RUN: clang-cc %s -emit-llvm -o - | FileCheck %s + +struct basic_ios{~basic_ios(); }; + +template<typename _CharT> struct basic_istream : virtual public basic_ios { + virtual ~basic_istream(){} +}; + +template<typename _CharT> struct basic_iostream : public basic_istream<_CharT> +{ + virtual ~basic_iostream(){} +}; + +basic_iostream<char> res; + +int main() { +} + +// CHECK: call void @_ZN9basic_iosD2Ev diff --git a/test/CodeGenCXX/virtual-bases.cpp b/test/CodeGenCXX/virtual-bases.cpp new file mode 100644 index 0000000..4b069ea --- /dev/null +++ b/test/CodeGenCXX/virtual-bases.cpp @@ -0,0 +1,17 @@ +// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin10 | FileCheck %s + +struct A { + A(); +}; + +// CHECK: define void @_ZN1AC1Ev(%struct.A* %this) +// CHECK: define void @_ZN1AC2Ev(%struct.A* %this) +A::A() { } + +struct B : virtual A { + B(); +}; + +// CHECK: define void @_ZN1BC1Ev(%struct.B* %this) +// CHECK: define void @_ZN1BC2Ev(%struct.B* %this, i8** %vtt) +B::B() { } diff --git a/test/CodeGenCXX/virtual-functions-incomplete-types.cpp b/test/CodeGenCXX/virtual-functions-incomplete-types.cpp new file mode 100644 index 0000000..1e1e962 --- /dev/null +++ b/test/CodeGenCXX/virtual-functions-incomplete-types.cpp @@ -0,0 +1,30 @@ +// RUN: clang-cc %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s + +struct A; + +struct B { + virtual void f(); + virtual A g(); +}; + +void B::f() { } + +// CHECK: declare void @_ZN1B1gEv() + +struct C; + +struct D { + virtual void f(); + virtual C g(); +}; + +void D::f() { } + +struct C { + int a; +}; + +// CHECK: define i64 @_ZN1D1gEv(%struct.B* %this) +C D::g() { + return C(); +} diff --git a/test/CodeGenCXX/x86_64-arguments.cpp b/test/CodeGenCXX/x86_64-arguments.cpp index 6b5e7a7..0e4c2ab 100644 --- a/test/CodeGenCXX/x86_64-arguments.cpp +++ b/test/CodeGenCXX/x86_64-arguments.cpp @@ -1,9 +1,24 @@ -// RUN: clang-cc -triple x86_64-unknown-unknown -emit-llvm -o %t %s -struct A { ~A(); }; +// RUN: clang-cc -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s -// RUN: grep 'define void @_Z2f11A(.struct.A\* .a)' %t -void f1(A a) { } +// CHECK: [[i64_i64_ty:%.*]] = type { i64, i64 } +// CHECK: [[i64_double_ty:%.*]] = type { i64, double } + +// Basic base class test. +struct f0_s0 { unsigned a; }; +struct f0_s1 : public f0_s0 { void *b; }; +// CHECK: define void @_Z2f05f0_s1([[i64_i64_ty]]) +void f0(f0_s1 a0) { } + +// Check with two eight-bytes in base class. +struct f1_s0 { unsigned a; unsigned b; float c; }; +struct f1_s1 : public f1_s0 { float d;}; +// CHECK: define void @_Z2f15f1_s1([[i64_double_ty]]) +void f1(f1_s1 a0) { } + +// Check with two eight-bytes in base class and merge. +struct f2_s0 { unsigned a; unsigned b; float c; }; +struct f2_s1 : public f2_s0 { char d;}; +// CHECK: define void @_Z2f25f2_s1([[i64_i64_ty]]) +void f2(f2_s1 a0) { } -// RUN: grep 'define void @_Z2f2v(.struct.A\* noalias sret .agg.result)' %t -A f2() { return A(); } diff --git a/test/CodeGenObjC/class-obj-hidden-visibility.m b/test/CodeGenObjC/class-obj-hidden-visibility.m deleted file mode 100644 index fc4ac12..0000000 --- a/test/CodeGenObjC/class-obj-hidden-visibility.m +++ /dev/null @@ -1,6 +0,0 @@ -// RUN: clang-cc -fvisibility=hidden -triple x86_64-apple-darwin10 -S -o - %s | grep -e "private_extern _OBJC_" | count 2 - -@interface INTF @end - -@implementation INTF @end - diff --git a/test/CodeGenObjC/constant-strings.m b/test/CodeGenObjC/constant-strings.m index 8482376..8204adc 100644 --- a/test/CodeGenObjC/constant-strings.m +++ b/test/CodeGenObjC/constant-strings.m @@ -1,6 +1,6 @@ // RUN: clang-cc -emit-llvm -o %t %s // RUN: clang-cc -fgnu-runtime -emit-llvm -o %t %s && grep NXConstantString %t | count 1 -// RUN: clang-cc -fgnu-runtime -fconstant-string-class=NSConstantString -emit-llvm -o %t %s && grep NSConstantString %t | count 1 +// RUN: clang-cc -fgnu-runtime -fconstant-string-class NSConstantString -emit-llvm -o %t %s && grep NSConstantString %t | count 1 id a = @"Hello World!"; diff --git a/test/CodeGenObjC/continuation-class.m b/test/CodeGenObjC/continuation-class.m index 305d6c7..c222310 100644 --- a/test/CodeGenObjC/continuation-class.m +++ b/test/CodeGenObjC/continuation-class.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s @interface Object - (id)new; diff --git a/test/CodeGenObjC/dot-syntax-1.m b/test/CodeGenObjC/dot-syntax-1.m index 6fab039..18b972f 100644 --- a/test/CodeGenObjC/dot-syntax-1.m +++ b/test/CodeGenObjC/dot-syntax-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s int printf(const char *, ...); diff --git a/test/CodeGenObjC/dot-syntax.m b/test/CodeGenObjC/dot-syntax.m index 348346b..01b7189 100644 --- a/test/CodeGenObjC/dot-syntax.m +++ b/test/CodeGenObjC/dot-syntax.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s int printf(const char *, ...); diff --git a/test/CodeGenObjC/encode-test.m b/test/CodeGenObjC/encode-test.m index 6665cb9..db8470b 100644 --- a/test/CodeGenObjC/encode-test.m +++ b/test/CodeGenObjC/encode-test.m @@ -66,12 +66,15 @@ struct Innermost { @interface Test { int ivar; + __attribute__((objc_gc(weak))) SEL selector; } -(void) test3: (Test* [3] [4])b ; +- (SEL**) meth : (SEL) arg : (SEL*****) arg1 : (SEL*)arg2 : (SEL**) arg3; @end @implementation Test -(void) test3: (Test* [3] [4])b {} +- (SEL**) meth : (SEL) arg : (SEL*****) arg1 : (SEL*)arg2 : (SEL**) arg3 {} @end struct S { int iS; }; diff --git a/test/CodeGenObjC/hidden-synthesized-ivar.m b/test/CodeGenObjC/hidden-synthesized-ivar.m deleted file mode 100644 index 50a87cb..0000000 --- a/test/CodeGenObjC/hidden-synthesized-ivar.m +++ /dev/null @@ -1,13 +0,0 @@ -// RUN: clang-cc -fvisibility=hidden -triple x86_64-apple-darwin10 -S -o - %s | grep -e "private_extern _OBJC_IVAR_" -@interface I -{ - int P; -} - -@property int P; -@end - -@implementation I -@synthesize P; -@end - diff --git a/test/CodeGenObjC/hidden-visibility.m b/test/CodeGenObjC/hidden-visibility.m index 082ee7a..8596b41 100644 --- a/test/CodeGenObjC/hidden-visibility.m +++ b/test/CodeGenObjC/hidden-visibility.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -fvisibility=hidden -fobjc-nonfragile-abi -emit-llvm -o - %s | FileCheck %s +// RUN: clang-cc -fvisibility hidden -fobjc-nonfragile-abi -emit-llvm -o - %s | FileCheck %s // CHECK: @"OBJC_IVAR_$_I.P" = hidden // CHECK: @"OBJC_CLASS_$_I" = hidden // CHECK: @"OBJC_METACLASS_$_I" = hidden diff --git a/test/CodeGenObjC/hidden.m b/test/CodeGenObjC/hidden.m index fd87d99..0c0dbb3 100644 --- a/test/CodeGenObjC/hidden.m +++ b/test/CodeGenObjC/hidden.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s __attribute__((visibility("hidden"))) @interface Hidden diff --git a/test/CodeGenObjC/messages-2.m b/test/CodeGenObjC/messages-2.m index 5cf4d2d..87f7cc6 100644 --- a/test/CodeGenObjC/messages-2.m +++ b/test/CodeGenObjC/messages-2.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s int printf(const char *, ...); diff --git a/test/CodeGenObjC/messages.m b/test/CodeGenObjC/messages.m index ea8809f..ac3b81d 100644 --- a/test/CodeGenObjC/messages.m +++ b/test/CodeGenObjC/messages.m @@ -1,8 +1,8 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s // RUN: grep "objc_msgSend" %t | count 6 -// RUN: clang-cc -fgnu-runtime --emit-llvm -o %t %s +// RUN: clang-cc -fgnu-runtime -emit-llvm -o %t %s // RUN: grep "objc_msg_lookup" %t | count 6 -// RUN: clang-cc -fgnu-runtime -fobjc-nonfragile-abi --emit-llvm -o %t %s +// RUN: clang-cc -fgnu-runtime -fobjc-nonfragile-abi -emit-llvm -o %t %s // RUN: grep "objc_msg_lookup_sender" %t | count 6 typedef struct { diff --git a/test/CodeGenObjC/metadata_symbols.m b/test/CodeGenObjC/metadata_symbols.m index c608cd4..9cc2296 100644 --- a/test/CodeGenObjC/metadata_symbols.m +++ b/test/CodeGenObjC/metadata_symbols.m @@ -10,7 +10,7 @@ // RUN: grep -F 'define internal void @"\01-[A im0]"' %t // RUN: grep -F 'define internal void @"\01-[A(Cat) im1]"' %t -// RUN: clang-cc -fobjc-nonfragile-abi -fvisibility=hidden -emit-llvm -o %t %s +// RUN: clang-cc -fobjc-nonfragile-abi -fvisibility hidden -emit-llvm -o %t %s // RUN: grep '@"OBJC_METACLASS_$_A" = hidden global .*section "__DATA, __objc_data", align 8' %t // RUN: grep '@"OBJC_CLASS_$_A" = hidden global .*section "__DATA, __objc_data", align 8' %t diff --git a/test/CodeGenObjC/newproperty-nested-synthesis-1.m b/test/CodeGenObjC/newproperty-nested-synthesis-1.m index 4d93198..898c81a 100644 --- a/test/CodeGenObjC/newproperty-nested-synthesis-1.m +++ b/test/CodeGenObjC/newproperty-nested-synthesis-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s @interface Object - (id) new; diff --git a/test/CodeGenObjC/property-getter-dot-syntax.m b/test/CodeGenObjC/property-getter-dot-syntax.m index c1cc5e9..8701b58 100644 --- a/test/CodeGenObjC/property-getter-dot-syntax.m +++ b/test/CodeGenObjC/property-getter-dot-syntax.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s @protocol NSObject - (void *)description; diff --git a/test/CodeGenObjC/property.m b/test/CodeGenObjC/property.m index 59f096f..2ab1054 100644 --- a/test/CodeGenObjC/property.m +++ b/test/CodeGenObjC/property.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --emit-llvm -o %t %s +// RUN: clang-cc -emit-llvm -o %t %s int printf(const char *, ...); diff --git a/test/CodeGenObjC/protocol-definition-hidden-visibility.m b/test/CodeGenObjC/protocol-definition-hidden-visibility.m deleted file mode 100644 index 31a864b..0000000 --- a/test/CodeGenObjC/protocol-definition-hidden-visibility.m +++ /dev/null @@ -1,19 +0,0 @@ -// RUN: clang-cc -triple x86_64-apple-darwin10 -S -o - %s | grep -e "private_extern l_OBJC_PROTOCOL_" | count 2 - -@interface FOO @end - -@interface NSObject @end - -@protocol SSHIPCProtocolHandler_BDC; - -typedef NSObject<SSHIPCProtocolHandler_BDC> _SSHIPCProtocolHandler_BDC; - -@interface SSHIPC_v2_RPFSProxy -@property(nonatomic,readonly,retain) _SSHIPCProtocolHandler_BDC* protocolHandler_BDC; -@end - -@implementation FOO -- (_SSHIPCProtocolHandler_BDC*) protocolHandler_BDC {@protocol(SSHIPCProtocolHandler_BDC); } -@end - - diff --git a/test/CodeGenObjC/sel-as-builtin-type.m b/test/CodeGenObjC/sel-as-builtin-type.m new file mode 100644 index 0000000..c65a5b2 --- /dev/null +++ b/test/CodeGenObjC/sel-as-builtin-type.m @@ -0,0 +1,23 @@ +// RUN: clang-cc -emit-llvm -o %t %s +// pr5025 +// radar 7405040 + +typedef const struct objc_selector { + void *sel_id; + const char *sel_types; +} *SEL; + +@interface I2 ++(id) dictionary; +@end + +@implementation I3; // expected-warning {{cannot find interface declaration for 'I3'}} ++(void) initialize { + I2 *a0 = [I2 dictionary]; +} +@end + +int func(SEL s1, SEL s2) +{ + return s1->sel_id == s2->sel_id; +} diff --git a/test/CodeGenObjC/undefined-protocol.m b/test/CodeGenObjC/undefined-protocol.m new file mode 100644 index 0000000..7fe0790 --- /dev/null +++ b/test/CodeGenObjC/undefined-protocol.m @@ -0,0 +1,6 @@ +// RUN: clang-cc -emit-llvm-only -fgnu-runtime %s + +@protocol MadeUpProtocol; + +@interface Object <MadeUpProtocol> @end +@implementation Object @end diff --git a/test/CodeGenObjC/variadic-sends.m b/test/CodeGenObjC/variadic-sends.m index e2d13e3..ab0beef 100644 --- a/test/CodeGenObjC/variadic-sends.m +++ b/test/CodeGenObjC/variadic-sends.m @@ -8,33 +8,33 @@ @end void f0(A *a) { - // CHECK-X86-32: call void bitcast (i8* (i8*, %struct.objc_selector*, ...)* @objc_msgSend to void (i8*, %struct.objc_selector*)*) - // CHECK-X86-64: call void bitcast (i8* (i8*, %struct.objc_selector*, ...)* @objc_msgSend to void (i8*, %struct.objc_selector*)*) + // CHECK-X86-32: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*) + // CHECK-X86-64: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*) [a im0]; } void f1(A *a) { - // CHECK-X86-32: call void bitcast (i8* (i8*, %struct.objc_selector*, ...)* @objc_msgSend to void (i8*, %struct.objc_selector*, i32)*) - // CHECK-X86-64: call void bitcast (i8* (i8*, %struct.objc_selector*, ...)* @objc_msgSend to void (i8*, %struct.objc_selector*, i32)*) + // CHECK-X86-32: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i32)*) + // CHECK-X86-64: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i32)*) [a im1: 1]; } void f2(A *a) { - // CHECK-X86-32: call void (i8*, %struct.objc_selector*, i32, i32, ...)* bitcast (i8* (i8*, %struct.objc_selector*, ...)* @objc_msgSend to void (i8*, %struct.objc_selector*, i32, i32, ...)*) - // CHECK-X86-64: call void (i8*, %struct.objc_selector*, i32, i32, ...)* bitcast (i8* (i8*, %struct.objc_selector*, ...)* @objc_msgSend to void (i8*, %struct.objc_selector*, i32, i32, ...)*) + // CHECK-X86-32: call void (i8*, i8*, i32, i32, ...)* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i32, i32, ...)*) + // CHECK-X86-64: call void (i8*, i8*, i32, i32, ...)* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i32, i32, ...)*) [a im2: 1, 2]; } @interface B : A @end @implementation B : A -(void) foo { - // CHECK-X86-32: call void bitcast (i8* (%struct._objc_super*, %struct.objc_selector*, ...)* @objc_msgSendSuper to void (%struct._objc_super*, %struct.objc_selector*, i32)*) - // CHECK-X86-64: call void bitcast (i8* (%struct._objc_super*, %struct.objc_selector*, ...)* @objc_msgSendSuper to void (%struct._objc_super*, %struct.objc_selector*, i32)*) + // CHECK-X86-32: call void bitcast (i8* (%struct._objc_method_description*, i8*, ...)* @objc_msgSendSuper to void (%struct._objc_method_description*, i8*, i32)*) + // CHECK-X86-64: call void bitcast (i8* (%struct._objc_method_description*, i8*, ...)* @objc_msgSendSuper to void (%struct._objc_method_description*, i8*, i32)*) [super im1: 1]; } -(void) bar { - // CHECK-X86-32: call void (%struct._objc_super*, %struct.objc_selector*, i32, i32, ...)* bitcast (i8* (%struct._objc_super*, %struct.objc_selector*, ...)* @objc_msgSendSuper to void (%struct._objc_super*, %struct.objc_selector*, i32, i32, ...)*) - // CHECK-X86-64: call void (%struct._objc_super*, %struct.objc_selector*, i32, i32, ...)* bitcast (i8* (%struct._objc_super*, %struct.objc_selector*, ...)* @objc_msgSendSuper to void (%struct._objc_super*, %struct.objc_selector*, i32, i32, ...)*) + // CHECK-X86-32: call void (%struct._objc_method_description*, i8*, i32, i32, ...)* bitcast (i8* (%struct._objc_method_description*, i8*, ...)* @objc_msgSendSuper to void (%struct._objc_method_description*, i8*, i32, i32, ...)*) + // CHECK-X86-64: call void (%struct._objc_method_description*, i8*, i32, i32, ...)* bitcast (i8* (%struct._objc_method_description*, i8*, ...)* @objc_msgSendSuper to void (%struct._objc_method_description*, i8*, i32, i32, ...)*) [super im2: 1, 2]; } diff --git a/test/Coverage/ast-printing.c b/test/Coverage/ast-printing.c index 2bed12e..640dc29 100644 --- a/test/Coverage/ast-printing.c +++ b/test/Coverage/ast-printing.c @@ -1,6 +1,6 @@ -// RUN: clang-cc --fsyntax-only %s -// RUN: clang-cc --ast-print %s -// RUN: clang-cc --ast-dump %s -// RUN: clang-cc --ast-print-xml -o %t %s +// RUN: clang-cc -fsyntax-only %s +// RUN: clang-cc -ast-print %s +// RUN: clang-cc -ast-dump %s +// RUN: clang-cc -ast-print-xml -o %t %s #include "c-language-features.inc" diff --git a/test/Coverage/ast-printing.cpp b/test/Coverage/ast-printing.cpp index 93c7191..d627fca 100644 --- a/test/Coverage/ast-printing.cpp +++ b/test/Coverage/ast-printing.cpp @@ -1,6 +1,6 @@ -// RUN: clang-cc --fsyntax-only %s -// RUN: clang-cc --ast-print %s -// RUN: clang-cc --ast-dump %s -// FIXME: clang-cc --ast-print-xml -o %t %s +// RUN: clang-cc -fsyntax-only %s +// RUN: clang-cc -ast-print %s +// RUN: clang-cc -ast-dump %s +// FIXME: clang-cc -ast-print-xml -o %t %s #include "cxx-language-features.inc" diff --git a/test/Coverage/ast-printing.m b/test/Coverage/ast-printing.m index e7589b8..1b81228 100644 --- a/test/Coverage/ast-printing.m +++ b/test/Coverage/ast-printing.m @@ -1,5 +1,5 @@ -// RUN: clang-cc --fsyntax-only %s -// RUN: clang-cc --ast-print %s -// RUN: clang-cc --ast-dump %s +// RUN: clang-cc -fsyntax-only %s +// RUN: clang-cc -ast-print %s +// RUN: clang-cc -ast-dump %s #include "objc-language-features.inc" diff --git a/test/Coverage/parse-callbacks.c b/test/Coverage/parse-callbacks.c index 537d630..e29b38b 100644 --- a/test/Coverage/parse-callbacks.c +++ b/test/Coverage/parse-callbacks.c @@ -1,4 +1,4 @@ -// RUN: clang-cc --parse-noop %s -// RUN: clang-cc --parse-print-callbacks %s +// RUN: clang-cc -parse-noop %s +// RUN: clang-cc -parse-print-callbacks %s #include "c-language-features.inc" diff --git a/test/Coverage/parse-callbacks.m b/test/Coverage/parse-callbacks.m index fc240cf..310a1a6 100644 --- a/test/Coverage/parse-callbacks.m +++ b/test/Coverage/parse-callbacks.m @@ -1,4 +1,4 @@ -// RUN: clang-cc --parse-noop %s -// RUN: clang-cc --parse-print-callbacks %s +// RUN: clang-cc -parse-noop %s +// RUN: clang-cc -parse-print-callbacks %s #include "objc-language-features.inc" diff --git a/test/Driver/clang-translation.c b/test/Driver/clang-translation.c index fe35184..f7f8b5e 100644 --- a/test/Driver/clang-translation.c +++ b/test/Driver/clang-translation.c @@ -1,14 +1,14 @@ -// RUN: clang -ccc-host-triple i386-unknown-unknown -### -S -O0 -Os %s -o %t.s -fverbose-asm 2> %t.log +// RUN: clang -ccc-host-triple i386-unknown-unknown -### -S -O0 -Os %s -o %t.s -fverbose-asm -funwind-tables 2> %t.log // RUN: grep '"-triple" "i386-unknown-unknown"' %t.log // RUN: grep '"-S"' %t.log // RUN: grep '"-disable-free"' %t.log -// RUN: grep '"--relocation-model" "static"' %t.log -// RUN: grep '"--disable-fp-elim"' %t.log -// RUN: grep '"--unwind-tables=0"' %t.log +// RUN: grep '"-mrelocation-model" "static"' %t.log +// RUN: grep '"-mdisable-fp-elim"' %t.log +// RUN: grep '"-munwind-tables"' %t.log // RUN: grep '"-Os"' %t.log // RUN: grep '"-o" .*clang-translation.*' %t.log -// RUN: grep '"--asm-verbose"' %t.log +// RUN: grep '"-masm-verbose"' %t.log // RUN: clang -ccc-host-triple i386-apple-darwin9 -### -S %s -o %t.s 2> %t.log -// RUN: grep '"--mcpu" "yonah"' %t.log +// RUN: grep '"-mcpu" "yonah"' %t.log // RUN: clang -ccc-host-triple x86_64-apple-darwin9 -### -S %s -o %t.s 2> %t.log -// RUN: grep '"--mcpu" "core2"' %t.log +// RUN: grep '"-mcpu" "core2"' %t.log diff --git a/test/Driver/flags.c b/test/Driver/flags.c index a324100..bc50aae 100644 --- a/test/Driver/flags.c +++ b/test/Driver/flags.c @@ -1,9 +1,9 @@ // RUN: clang -ccc-host-triple i386-apple-darwin9 -### -S -msoft-float %s 2> %t.log -// RUN: grep '"--no-implicit-float"' %t.log +// RUN: grep '"-no-implicit-float"' %t.log // RUN: clang -ccc-host-triple i386-apple-darwin9 -### -S -msoft-float -mno-soft-float %s 2> %t.log -// RUN: grep '"--no-implicit-float"' %t.log | count 0 +// RUN: grep '"-no-implicit-float"' %t.log | count 0 // RUN: clang -ccc-host-triple i386-apple-darwin9 -### -S -mno-soft-float %s -msoft-float 2> %t.log -// RUN: grep '"--no-implicit-float"' %t.log +// RUN: grep '"-no-implicit-float"' %t.log diff --git a/test/FixIt/fixit-cxx0x.cpp b/test/FixIt/fixit-cxx0x.cpp new file mode 100644 index 0000000..2c783bc --- /dev/null +++ b/test/FixIt/fixit-cxx0x.cpp @@ -0,0 +1,14 @@ +/* RUN: clang-cc -std=c++0x -fixit %s -o - | clang-cc -x c++ -std=c++0x - + */ + +/* This is a test of the various code modification hints that only + apply in C++0x. */ +struct A { + explicit operator int(); // expected-note{{conversion to integral type}} +}; + +void x() { + switch(A()) { // expected-error{{explicit conversion to}} + } +} + diff --git a/test/Frontend/mmacosx-version-min-test.c b/test/Frontend/mmacosx-version-min-test.c deleted file mode 100644 index d117d1c..0000000 --- a/test/Frontend/mmacosx-version-min-test.c +++ /dev/null @@ -1 +0,0 @@ -// RUN: not clang-cc -fsyntax-only -mmacosx-version-min=10.4 -triple=x86_64-apple-darwin %s diff --git a/test/Frontend/output-failures.c b/test/Frontend/output-failures.c new file mode 100644 index 0000000..a8687c7 --- /dev/null +++ b/test/Frontend/output-failures.c @@ -0,0 +1,4 @@ +// RUN: not clang-cc -emit-llvm -o %S/doesnotexist/somename %s 2> %t +// RUN: FileCheck -check-prefix=OUTPUTFAIL -input-file=%t %s + +// OUTPUTFAIL: Error opening output file '{{.*}}doesnotexist{{.*}}' diff --git a/test/Frontend/rewrite-macros.c b/test/Frontend/rewrite-macros.c index 2d9fef4..1667925 100644 --- a/test/Frontend/rewrite-macros.c +++ b/test/Frontend/rewrite-macros.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -verify --rewrite-macros -o %t %s +// RUN: clang-cc -verify -rewrite-macros -o %t %s #define A(a,b) a ## b diff --git a/test/Index/c-index-api-fn-scan.m b/test/Index/c-index-api-fn-scan.m new file mode 100644 index 0000000..3e2c9c2 --- /dev/null +++ b/test/Index/c-index-api-fn-scan.m @@ -0,0 +1,217 @@ +// RUN: clang-cc -triple x86_64-apple-darwin10 -fobjc-nonfragile-abi -fblocks -emit-pch -x objective-c %s -o %t.ast +// RUN: c-index-test -test-load-tu %t.ast scan-function | FileCheck %s + + + + + + + + + + + + + + + + + +@interface Foo +{ +} + +- foo; ++ fooC; + +@end + +@interface Bar : Foo +{ +} + +@end + +@interface Foo (FooCat) +- (int) catMethodWithFloat:(float) fArg; +- (float) floatMethod; +@end + +@protocol Proto +- pMethod; +@end + +@protocol SubP <Proto> +- spMethod; +@end + +@interface Baz : Bar <SubP> +{ + int _anIVar; +} + +- (Foo *) bazMethod; + +@end + +enum { + someEnum +}; + + + + + + + + + + + + + + + + + + + + + + + +int main (int argc, const char * argv[]) { + Baz * bee; + id a = [bee foo]; + id <SubP> c = [Foo fooC]; + id <Proto> d; + d = c; + [d pMethod]; + [bee catMethodWithFloat:[bee floatMethod]]; + main(someEnum, (const char **)bee); +} + +// CHECK: c-index-api-fn-scan.m:84:2: ObjCClassRef=Baz:84:8 [Context:Baz] +// CHECK: c-index-api-fn-scan.m:84:3: ObjCClassRef=Baz:84:8 [Context:Baz] +// CHECK: c-index-api-fn-scan.m:84:4: ObjCClassRef=Baz:84:8 [Context:Baz] +// CHECK: c-index-api-fn-scan.m:84:6: VarDecl=bee:84:8 [Context:bee] +// CHECK: c-index-api-fn-scan.m:84:8: VarDecl=bee:84:8 [Context:bee] +// CHECK: c-index-api-fn-scan.m:84:9: VarDecl=bee:84:8 [Context:bee] +// CHECK: c-index-api-fn-scan.m:84:10: VarDecl=bee:84:8 [Context:bee] +// CHECK: <invalid loc>:85:2: TypedefDecl=id:0:0 [Context:id] +// CHECK: <invalid loc>:85:3: TypedefDecl=id:0:0 [Context:id] +// CHECK: c-index-api-fn-scan.m:85:5: VarDecl=a:85:5 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:6: VarDecl=a:85:5 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:7: VarDecl=a:85:5 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:8: VarDecl=a:85:5 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:9: ObjCSelectorRef=foo:24:1 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:10: VarRef=bee:84:8 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:11: VarRef=bee:84:8 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:12: VarRef=bee:84:8 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:13: ObjCSelectorRef=foo:24:1 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:14: ObjCSelectorRef=foo:24:1 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:15: ObjCSelectorRef=foo:24:1 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:16: ObjCSelectorRef=foo:24:1 [Context:a] +// CHECK: c-index-api-fn-scan.m:85:17: ObjCSelectorRef=foo:24:1 [Context:a] +// CHECK: <invalid loc>:86:2: TypedefDecl=id:0:0 [Context:id] +// CHECK: <invalid loc>:86:3: TypedefDecl=id:0:0 [Context:id] +// CHECK: c-index-api-fn-scan.m:86:5: VarDecl=c:86:12 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:6: ObjCProtocolRef=SubP:86:12 [Context:SubP] +// CHECK: c-index-api-fn-scan.m:86:7: ObjCProtocolRef=SubP:86:12 [Context:SubP] +// CHECK: c-index-api-fn-scan.m:86:8: ObjCProtocolRef=SubP:86:12 [Context:SubP] +// CHECK: c-index-api-fn-scan.m:86:9: ObjCProtocolRef=SubP:86:12 [Context:SubP] +// CHECK: c-index-api-fn-scan.m:86:10: VarDecl=c:86:12 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:12: VarDecl=c:86:12 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:13: VarDecl=c:86:12 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:14: VarDecl=c:86:12 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:15: VarDecl=c:86:12 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:16: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:17: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:18: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:19: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:20: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:21: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:22: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:23: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:24: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: c-index-api-fn-scan.m:86:25: ObjCSelectorRef=fooC:25:1 [Context:c] +// CHECK: <invalid loc>:87:2: TypedefDecl=id:0:0 [Context:id] +// CHECK: <invalid loc>:87:3: TypedefDecl=id:0:0 [Context:id] +// CHECK: c-index-api-fn-scan.m:87:5: VarDecl=d:87:13 [Context:d] +// CHECK: c-index-api-fn-scan.m:87:6: ObjCProtocolRef=Proto:87:13 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:7: ObjCProtocolRef=Proto:87:13 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:8: ObjCProtocolRef=Proto:87:13 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:9: ObjCProtocolRef=Proto:87:13 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:10: ObjCProtocolRef=Proto:87:13 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:11: VarDecl=d:87:13 [Context:d] +// CHECK: c-index-api-fn-scan.m:87:13: VarDecl=d:87:13 [Context:d] +// CHECK: c-index-api-fn-scan.m:88:2: VarRef=d:87:13 [Context:main] +// CHECK: c-index-api-fn-scan.m:88:6: VarRef=c:86:12 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:2: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:3: VarRef=d:87:13 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:4: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:5: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:6: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:7: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:8: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:9: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:10: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:11: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:89:12: ObjCSelectorRef=pMethod:41:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:2: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:3: VarRef=bee:84:8 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:4: VarRef=bee:84:8 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:5: VarRef=bee:84:8 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:6: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:7: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:8: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:9: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:10: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:11: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:12: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:13: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:14: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:15: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:16: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:17: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:18: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:19: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:20: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:21: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:22: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:23: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:24: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:25: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:26: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:27: VarRef=bee:84:8 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:28: VarRef=bee:84:8 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:29: VarRef=bee:84:8 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:30: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:31: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:32: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:33: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:34: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:35: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:36: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:37: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:38: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:39: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:40: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:41: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:42: ObjCSelectorRef=floatMethod:37:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:90:43: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:3: FunctionRef=main:83:5 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:4: FunctionRef=main:83:5 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:5: FunctionRef=main:83:5 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:6: FunctionRef=main:83:5 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:8: EnumConstantRef=someEnum:58:3 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:9: EnumConstantRef=someEnum:58:3 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:10: EnumConstantRef=someEnum:58:3 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:11: EnumConstantRef=someEnum:58:3 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:12: EnumConstantRef=someEnum:58:3 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:13: EnumConstantRef=someEnum:58:3 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:14: EnumConstantRef=someEnum:58:3 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:15: EnumConstantRef=someEnum:58:3 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:33: VarRef=bee:84:8 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:34: VarRef=bee:84:8 [Context:main] +// CHECK: c-index-api-fn-scan.m:91:35: VarRef=bee:84:8 [Context:main] diff --git a/test/Index/c-index-api-loadTU-test.m b/test/Index/c-index-api-loadTU-test.m index 7ab1435..1d5a9a8 100644 --- a/test/Index/c-index-api-loadTU-test.m +++ b/test/Index/c-index-api-loadTU-test.m @@ -98,127 +98,3 @@ int main (int argc, const char * argv[]) { // CHECK: c-index-api-loadTU-test.m:85:5: VarDecl=a:85:5 [Context=main] // CHECK: c-index-api-loadTU-test.m:86:12: VarDecl=c:86:12 [Context=main] // CHECK: c-index-api-loadTU-test.m:87:13: VarDecl=d:87:13 [Context=main] -// CHECK: c-index-api-loadTU-test.m:84:2: ObjCClassRef=Baz:84:8 [Context:Baz] -// CHECK: c-index-api-loadTU-test.m:84:3: ObjCClassRef=Baz:84:8 [Context:Baz] -// CHECK: c-index-api-loadTU-test.m:84:4: ObjCClassRef=Baz:84:8 [Context:Baz] -// CHECK: c-index-api-loadTU-test.m:84:6: VarDecl=bee:84:8 [Context:bee] -// CHECK: c-index-api-loadTU-test.m:84:8: VarDecl=bee:84:8 [Context:bee] -// CHECK: c-index-api-loadTU-test.m:84:9: VarDecl=bee:84:8 [Context:bee] -// CHECK: c-index-api-loadTU-test.m:84:10: VarDecl=bee:84:8 [Context:bee] -// CHECK: <invalid loc>:85:2: TypedefDecl=id:0:0 [Context:id] -// CHECK: <invalid loc>:85:3: TypedefDecl=id:0:0 [Context:id] -// CHECK: c-index-api-loadTU-test.m:85:5: VarDecl=a:85:5 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:6: VarDecl=a:85:5 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:7: VarDecl=a:85:5 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:8: VarDecl=a:85:5 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:9: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:10: VarRef=bee:84:8 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:11: VarRef=bee:84:8 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:12: VarRef=bee:84:8 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:13: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:14: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:15: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:16: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-loadTU-test.m:85:17: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: <invalid loc>:86:2: TypedefDecl=id:0:0 [Context:id] -// CHECK: <invalid loc>:86:3: TypedefDecl=id:0:0 [Context:id] -// CHECK: c-index-api-loadTU-test.m:86:5: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:6: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-loadTU-test.m:86:7: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-loadTU-test.m:86:8: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-loadTU-test.m:86:9: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-loadTU-test.m:86:10: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:12: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:13: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:14: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:15: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:16: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:17: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:18: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:19: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:20: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:21: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:22: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:23: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:24: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-loadTU-test.m:86:25: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: <invalid loc>:87:2: TypedefDecl=id:0:0 [Context:id] -// CHECK: <invalid loc>:87:3: TypedefDecl=id:0:0 [Context:id] -// CHECK: c-index-api-loadTU-test.m:87:5: VarDecl=d:87:13 [Context:d] -// CHECK: c-index-api-loadTU-test.m:87:6: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-loadTU-test.m:87:7: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-loadTU-test.m:87:8: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-loadTU-test.m:87:9: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-loadTU-test.m:87:10: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-loadTU-test.m:87:11: VarDecl=d:87:13 [Context:d] -// CHECK: c-index-api-loadTU-test.m:87:13: VarDecl=d:87:13 [Context:d] -// CHECK: c-index-api-loadTU-test.m:88:2: VarRef=d:87:13 [Context:main] -// CHECK: c-index-api-loadTU-test.m:88:6: VarRef=c:86:12 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:2: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:3: VarRef=d:87:13 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:4: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:5: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:6: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:7: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:8: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:9: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:10: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:11: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:89:12: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:2: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:3: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:4: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:5: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:6: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:7: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:8: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:9: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:10: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:11: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:12: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:13: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:14: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:15: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:16: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:17: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:18: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:19: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:20: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:21: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:22: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:23: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:24: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:25: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:26: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:27: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:28: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:29: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:30: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:31: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:32: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:33: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:34: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:35: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:36: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:37: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:38: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:39: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:40: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:41: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:42: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:90:43: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:3: FunctionRef=main:83:5 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:4: FunctionRef=main:83:5 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:5: FunctionRef=main:83:5 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:6: FunctionRef=main:83:5 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:8: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:9: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:10: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:11: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:12: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:13: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:14: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:15: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:33: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:34: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-loadTU-test.m:91:35: VarRef=bee:84:8 [Context:main] diff --git a/test/Index/c-index-api-test.m b/test/Index/c-index-api-test.m deleted file mode 100644 index 55669e7..0000000 --- a/test/Index/c-index-api-test.m +++ /dev/null @@ -1,224 +0,0 @@ -// RUN: clang-cc -triple x86_64-apple-darwin10 -emit-pch -x objective-c %s -o %t.ast -// RUN: c-index-test %t.ast all | FileCheck %s - -// CHECK: <invalid loc>:0:0: TypedefDecl=__int128_t:0:0 [Context=c-index-api-test.m] -// CHECK: <invalid loc>:0:0: TypedefDecl=__uint128_t:0:0 [Context=c-index-api-test.m] -// CHECK: <invalid loc>:0:0: StructDecl=objc_selector:0:0 [Context=c-index-api-test.m] -// CHECK: <invalid loc>:0:0: TypedefDecl=SEL:0:0 [Context=c-index-api-test.m] -// CHECK: <invalid loc>:0:0: ObjCInterfaceDecl=Protocol:0:0 [Context=c-index-api-test.m] -// CHECK: <invalid loc>:0:0: TypedefDecl=id:0:0 [Context=c-index-api-test.m] -// CHECK: <invalid loc>:0:0: TypedefDecl=Class:0:0 [Context=c-index-api-test.m] -// CHECK: <built-in>:79:16: StructDecl=__va_list_tag:79:16 [Context=c-index-api-test.m] -// CHECK: <built-in>:79:42: FieldDecl=gp_offset:79:42 [Context=__va_list_tag] -// CHECK: <built-in>:79:63: FieldDecl=fp_offset:79:63 [Context=__va_list_tag] -// CHECK: <built-in>:79:81: FieldDecl=overflow_arg_area:79:81 [Context=__va_list_tag] -// CHECK: <built-in>:79:107: FieldDecl=reg_save_area:79:107 [Context=__va_list_tag] -// CHECK: <built-in>:79:123: TypedefDecl=__va_list_tag:79:123 [Context=c-index-api-test.m] -// CHECK: <built-in>:79:159: TypedefDecl=__builtin_va_list:79:159 [Context=c-index-api-test.m] -// - -@interface Foo -{ -} - -- foo; -+ fooC; - -@end - -@interface Bar : Foo -{ -} - -@end - -@interface Foo (FooCat) -- (int) catMethodWithFloat:(float) fArg; -- (float) floatMethod; -@end - -@protocol Proto -- pMethod; -@end - -@protocol SubP <Proto> -- spMethod; -@end - -@interface Baz : Bar <SubP> -{ - int _anIVar; -} - -- (Foo *) bazMethod; - -@end - -enum { - someEnum -}; - -// CHECK: c-index-api-test.m:20:12: ObjCInterfaceDecl=Foo:20:1 [Context=c-index-api-test.m] -// CHECK: c-index-api-test.m:24:1: ObjCInstanceMethodDecl=foo:24:1 [Context=Foo] -// CHECK: c-index-api-test.m:25:1: ObjCClassMethodDecl=fooC:25:1 [Context=Foo] -// CHECK: c-index-api-test.m:29:12: ObjCInterfaceDecl=Bar:29:1 [Context=c-index-api-test.m] -// CHECK: c-index-api-test.m:29:18: ObjCSuperClassRef=Foo:29:1 [Context=Bar] -// CHECK: c-index-api-test.m:35:1: ObjCCategoryDecl=FooCat:35:1 [Context=c-index-api-test.m] -// CHECK: c-index-api-test.m:20:1: ObjCClassRef=Foo:35:1 [Context=FooCat] -// CHECK: c-index-api-test.m:36:1: ObjCInstanceMethodDecl=catMethodWithFloat::36:1 [Context=FooCat] -// CHECK: c-index-api-test.m:37:1: ObjCInstanceMethodDecl=floatMethod:37:1 [Context=FooCat] -// CHECK: c-index-api-test.m:40:1: ObjCProtocolDecl=Proto:40:1 [Context=c-index-api-test.m] -// CHECK: c-index-api-test.m:41:1: ObjCInstanceMethodDecl=pMethod:41:1 [Context=Proto] -// CHECK: c-index-api-test.m:44:1: ObjCProtocolDecl=SubP:44:1 [Context=c-index-api-test.m] -// CHECK: c-index-api-test.m:40:1: ObjCProtocolRef=Proto:40:1 [Context=SubP] -// CHECK: c-index-api-test.m:45:1: ObjCInstanceMethodDecl=spMethod:45:1 [Context=SubP] -// CHECK: c-index-api-test.m:48:12: ObjCInterfaceDecl=Baz:48:1 [Context=c-index-api-test.m] -// CHECK: c-index-api-test.m:48:18: ObjCSuperClassRef=Bar:48:1 [Context=Baz] -// CHECK: c-index-api-test.m:44:1: ObjCProtocolRef=SubP:44:1 [Context=Baz] -// CHECK: c-index-api-test.m:50:9: ObjCIvarDecl=_anIVar:50:9 [Context=Baz] -// CHECK: c-index-api-test.m:53:1: ObjCInstanceMethodDecl=bazMethod:53:1 [Context=Baz] -// CHECK: c-index-api-test.m:57:1: EnumDecl=:57:1 [Context=c-index-api-test.m] -// CHECK: c-index-api-test.m:58:3: EnumConstantDecl=someEnum:58:3 [Context=] - -int main (int argc, const char * argv[]) { - Baz * bee; - id a = [bee foo]; - id <SubP> c = [Foo fooC]; - id <Proto> d; - d = c; - [d pMethod]; - [bee catMethodWithFloat:[bee floatMethod]]; - main(someEnum, (const char **)bee); -} - -// CHECK: c-index-api-test.m:83:5: FunctionDefn=main [Context=c-index-api-test.m] -// CHECK: c-index-api-test.m:83:15: ParmDecl=argc:83:15 [Context=main] -// CHECK: c-index-api-test.m:83:34: ParmDecl=argv:83:34 [Context=main] -// CHECK: c-index-api-test.m:84:8: VarDecl=bee:84:8 [Context=main] -// CHECK: c-index-api-test.m:85:5: VarDecl=a:85:5 [Context=main] -// CHECK: c-index-api-test.m:86:12: VarDecl=c:86:12 [Context=main] -// CHECK: c-index-api-test.m:87:13: VarDecl=d:87:13 [Context=main] -// CHECK: c-index-api-test.m:84:2: ObjCClassRef=Baz:84:8 [Context:Baz] -// CHECK: c-index-api-test.m:84:3: ObjCClassRef=Baz:84:8 [Context:Baz] -// CHECK: c-index-api-test.m:84:4: ObjCClassRef=Baz:84:8 [Context:Baz] -// CHECK: c-index-api-test.m:84:6: VarDecl=bee:84:8 [Context:bee] -// CHECK: c-index-api-test.m:84:8: VarDecl=bee:84:8 [Context:bee] -// CHECK: c-index-api-test.m:84:9: VarDecl=bee:84:8 [Context:bee] -// CHECK: c-index-api-test.m:84:10: VarDecl=bee:84:8 [Context:bee] -// CHECK: <invalid loc>:85:2: TypedefDecl=id:0:0 [Context:id] -// CHECK: <invalid loc>:85:3: TypedefDecl=id:0:0 [Context:id] -// CHECK: c-index-api-test.m:85:5: VarDecl=a:85:5 [Context:a] -// CHECK: c-index-api-test.m:85:6: VarDecl=a:85:5 [Context:a] -// CHECK: c-index-api-test.m:85:7: VarDecl=a:85:5 [Context:a] -// CHECK: c-index-api-test.m:85:8: VarDecl=a:85:5 [Context:a] -// CHECK: c-index-api-test.m:85:9: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-test.m:85:10: VarRef=bee:84:8 [Context:a] -// CHECK: c-index-api-test.m:85:11: VarRef=bee:84:8 [Context:a] -// CHECK: c-index-api-test.m:85:12: VarRef=bee:84:8 [Context:a] -// CHECK: c-index-api-test.m:85:13: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-test.m:85:14: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-test.m:85:15: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-test.m:85:16: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: c-index-api-test.m:85:17: ObjCSelectorRef=foo:24:1 [Context:a] -// CHECK: <invalid loc>:86:2: TypedefDecl=id:0:0 [Context:id] -// CHECK: <invalid loc>:86:3: TypedefDecl=id:0:0 [Context:id] -// CHECK: c-index-api-test.m:86:5: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-test.m:86:6: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-test.m:86:7: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-test.m:86:8: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-test.m:86:9: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-test.m:86:10: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-test.m:86:12: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-test.m:86:13: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-test.m:86:14: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-test.m:86:15: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-test.m:86:16: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:17: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:18: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:19: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:20: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:21: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:22: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:23: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:24: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: c-index-api-test.m:86:25: ObjCSelectorRef=fooC:25:1 [Context:c] -// CHECK: <invalid loc>:87:2: TypedefDecl=id:0:0 [Context:id] -// CHECK: <invalid loc>:87:3: TypedefDecl=id:0:0 [Context:id] -// CHECK: c-index-api-test.m:87:5: VarDecl=d:87:13 [Context:d] -// CHECK: c-index-api-test.m:87:6: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-test.m:87:7: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-test.m:87:8: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-test.m:87:9: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-test.m:87:10: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-test.m:87:11: VarDecl=d:87:13 [Context:d] -// CHECK: c-index-api-test.m:87:13: VarDecl=d:87:13 [Context:d] -// CHECK: c-index-api-test.m:88:2: VarRef=d:87:13 [Context:main] -// CHECK: c-index-api-test.m:88:6: VarRef=c:86:12 [Context:main] -// CHECK: c-index-api-test.m:89:2: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:3: VarRef=d:87:13 [Context:main] -// CHECK: c-index-api-test.m:89:4: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:5: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:6: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:7: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:8: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:9: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:10: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:11: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:89:12: ObjCSelectorRef=pMethod:41:1 [Context:main] -// CHECK: c-index-api-test.m:90:2: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:3: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-test.m:90:4: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-test.m:90:5: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-test.m:90:6: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:7: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:8: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:9: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:10: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:11: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:12: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:13: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:14: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:15: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:16: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:17: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:18: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:19: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:20: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:21: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:22: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:23: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:24: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:25: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:90:26: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:27: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-test.m:90:28: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-test.m:90:29: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-test.m:90:30: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:31: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:32: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:33: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:34: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:35: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:36: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:37: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:38: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:39: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:40: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:41: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:42: ObjCSelectorRef=floatMethod:37:1 [Context:main] -// CHECK: c-index-api-test.m:90:43: ObjCSelectorRef=catMethodWithFloat::36:1 [Context:main] -// CHECK: c-index-api-test.m:91:3: FunctionRef=main:83:5 [Context:main] -// CHECK: c-index-api-test.m:91:4: FunctionRef=main:83:5 [Context:main] -// CHECK: c-index-api-test.m:91:5: FunctionRef=main:83:5 [Context:main] -// CHECK: c-index-api-test.m:91:6: FunctionRef=main:83:5 [Context:main] -// CHECK: c-index-api-test.m:91:8: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-test.m:91:9: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-test.m:91:10: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-test.m:91:11: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-test.m:91:12: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-test.m:91:13: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-test.m:91:14: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-test.m:91:15: EnumConstantRef=someEnum:58:3 [Context:main] -// CHECK: c-index-api-test.m:91:33: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-test.m:91:34: VarRef=bee:84:8 [Context:main] -// CHECK: c-index-api-test.m:91:35: VarRef=bee:84:8 [Context:main] diff --git a/test/Index/c-index-pch.h b/test/Index/c-index-pch.h deleted file mode 100644 index 6dda180..0000000 --- a/test/Index/c-index-pch.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef C_INDEX_PCH_H -#define C_INDEX_PCH_H - -void foo(int i, float f); -extern int bar; - -#endif // C_INDEX_PCH_H diff --git a/test/Index/foo.h b/test/Index/foo.h deleted file mode 100644 index 7670c00..0000000 --- a/test/Index/foo.h +++ /dev/null @@ -1,8 +0,0 @@ -extern int global_var; - -void foo_func(int param1); -void bar_func(void); - -struct MyStruct { - int field_var; -}; diff --git a/test/Index/objc.h b/test/Index/objc.h deleted file mode 100644 index c671add..0000000 --- a/test/Index/objc.h +++ /dev/null @@ -1,11 +0,0 @@ -@interface Base { - int my_var; -} --(int) my_var; --(void) my_method: (int)param; -+(void) my_method: (int)param; -@end - -@interface Sub : Base --(void) my_method: (int)param; -@end diff --git a/test/Index/t1.c b/test/Index/t1.c deleted file mode 100644 index 45e0488..0000000 --- a/test/Index/t1.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "foo.h" - -void foo_func(int param1) { - int local_var = global_var; - for (int for_var = 100; for_var < 500; ++for_var) { - local_var = param1 + for_var; - } - bar_func(); -} - -struct S1 { - int x; -}; - -struct S2 { - int x; -}; - -void field_test(void) { - struct S1 s1; - s1.x = 0; - ((struct S2 *)0)->x = 0; - - struct MyStruct ms; - ms.field_var = 10; -} - -int (^CP)(int) = ^(int x) { return x * global_var; }; - -// Suppress 'no run line' failure. -// RUN: true diff --git a/test/Index/t1.m b/test/Index/t1.m deleted file mode 100644 index b2a7a37..0000000 --- a/test/Index/t1.m +++ /dev/null @@ -1,23 +0,0 @@ -#include "objc.h" - -static void foo() { - Base *base; - int x = [base my_var]; - [base my_method:x]; - [Base my_method:x]; -} - -@implementation Base --(int) my_var { - return my_var; -} - --(void) my_method: (int)param { -} - -+(void) my_method: (int)param { -} -@end - -// Suppress 'no run line' failure. -// RUN: true diff --git a/test/Index/t2.c b/test/Index/t2.c deleted file mode 100644 index bf52869..0000000 --- a/test/Index/t2.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "foo.h" - -int global_var = 10; - -void bar_func(void) { - global_var += 100; - foo_func(global_var); - - struct MyStruct *ms; - ms->field_var = 10; -} - -// Suppress 'no run line' failure. -// RUN: true diff --git a/test/Index/t2.m b/test/Index/t2.m deleted file mode 100644 index 00d2f1d..0000000 --- a/test/Index/t2.m +++ /dev/null @@ -1,16 +0,0 @@ -#include "objc.h" - -static void foo() { - Sub *sub; - int x = [sub my_var]; - [sub my_method:x]; - [Sub my_method:x]; -} - -@implementation Sub --(void) my_method: (int)param { -} -@end - -// Suppress 'no run line' failure. -// RUN: true diff --git a/test/Lexer/constants-ms.c b/test/Lexer/constants-ms.c new file mode 100644 index 0000000..8176ec3 --- /dev/null +++ b/test/Lexer/constants-ms.c @@ -0,0 +1,12 @@ +// RUN: clang-cc -fsyntax-only -verify -fms-extensions %s + +__int8 x1 = 3i8; +__int16 x2 = 4i16; +__int32 x3 = 5i32; +__int64 x5 = 0x42i64; +__int64 x4 = 70000000i128; + +__int64 y = 0x42i64u; // expected-error {{invalid suffix}} +__int64 w = 0x43ui64; // expected-error {{invalid suffix}} +__int64 z = 9Li64; // expected-error {{invalid suffix}} +__int64 q = 10lli64; // expected-error {{invalid suffix}} diff --git a/test/Misc/diag-checker.c b/test/Misc/diag-checker.c deleted file mode 100644 index 4733ee1..0000000 --- a/test/Misc/diag-checker.c +++ /dev/null @@ -1,5 +0,0 @@ -// RUN: clang-cc -fsyntax-only -verify %s - -#include <stdio.h> - -void foo(FILE *FP) {} diff --git a/test/PCH/method_pool.m b/test/PCH/method_pool.m index 3fe45a6..0534388 100644 --- a/test/PCH/method_pool.m +++ b/test/PCH/method_pool.m @@ -2,7 +2,7 @@ // RUN: clang-cc -include %S/method_pool.h -fsyntax-only -verify %s // Test with pch. -// RUN: clang-cc -x=objective-c -emit-pch -o %t %S/method_pool.h +// RUN: clang-cc -x objective-c -emit-pch -o %t %S/method_pool.h // RUN: clang-cc -include-pch %t -fsyntax-only -verify %s int message_id(id x) { diff --git a/test/PCH/objc_import.m b/test/PCH/objc_import.m index 83f389c..1289386 100644 --- a/test/PCH/objc_import.m +++ b/test/PCH/objc_import.m @@ -2,7 +2,7 @@ // RUN: clang-cc -include %S/objc_import.h -fsyntax-only -verify %s // Test with pch. -// RUN: clang-cc -x=objective-c -emit-pch -o %t %S/objc_import.h +// RUN: clang-cc -x objective-c -emit-pch -o %t %S/objc_import.h // RUN: clang-cc -include-pch %t -fsyntax-only -verify %s #import "objc_import.h" diff --git a/test/PCH/objc_methods.m b/test/PCH/objc_methods.m index aff34d1..136e397 100644 --- a/test/PCH/objc_methods.m +++ b/test/PCH/objc_methods.m @@ -2,7 +2,7 @@ // RUN: clang-cc -include %S/objc_methods.h -fsyntax-only -verify %s // Test with pch. -// RUN: clang-cc -x=objective-c -emit-pch -o %t %S/objc_methods.h +// RUN: clang-cc -x objective-c -emit-pch -o %t %S/objc_methods.h // RUN: clang-cc -include-pch %t -fsyntax-only -verify %s void func() { diff --git a/test/PCH/objc_property.m b/test/PCH/objc_property.m index a1d3eb9..5992787 100644 --- a/test/PCH/objc_property.m +++ b/test/PCH/objc_property.m @@ -2,7 +2,7 @@ // RUN: clang-cc -include %S/objc_property.h -fsyntax-only -verify %s // Test with pch. -// RUN: clang-cc -x=objective-c -emit-pch -o %t %S/objc_property.h +// RUN: clang-cc -x objective-c -emit-pch -o %t %S/objc_property.h // RUN: clang-cc -include-pch %t -fsyntax-only -verify %s void func() { diff --git a/test/PCH/reloc.c b/test/PCH/reloc.c index 36247d5..ba8e70d 100644 --- a/test/PCH/reloc.c +++ b/test/PCH/reloc.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -emit-pch -o %t --relocatable-pch -isysroot %S/libroot %S/libroot/usr/include/reloc.h +// RUN: clang-cc -emit-pch -o %t -relocatable-pch -isysroot %S/libroot %S/libroot/usr/include/reloc.h // RUN: clang-cc -include-pch %t -isysroot %S/libroot %s -verify // RUN: not clang-cc -include-pch %t %s diff --git a/test/Parser/MicrosoftExtensions.c b/test/Parser/MicrosoftExtensions.c index 572ac44..9c804c3 100644 --- a/test/Parser/MicrosoftExtensions.c +++ b/test/Parser/MicrosoftExtensions.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify -fms-extensions -x=objective-c++ %s +// RUN: clang-cc -fsyntax-only -verify -fms-extensions -x objective-c++ %s __stdcall int func0(); int __stdcall func(); typedef int (__cdecl *tptr)(); diff --git a/test/Parser/attributes.c b/test/Parser/attributes.c index dc2bb02..cad39d3 100644 --- a/test/Parser/attributes.c +++ b/test/Parser/attributes.c @@ -51,3 +51,4 @@ int foo42(void) { // rdar://6096491 void __attribute__((noreturn)) d0(void), __attribute__((noreturn)) d1(void); +void d2(void) __attribute__((noreturn)), d3(void) __attribute__((noreturn)); diff --git a/test/Parser/cxx-attributes.cpp b/test/Parser/cxx-attributes.cpp new file mode 100644 index 0000000..743d9b9 --- /dev/null +++ b/test/Parser/cxx-attributes.cpp @@ -0,0 +1,9 @@ +// RUN: clang-cc -fsyntax-only -verify %s
+
+class c {
+ virtual void f1(const char* a, ...)
+ __attribute__ (( __format__(__printf__,2,3) )) = 0;
+ virtual void f2(const char* a, ...)
+ __attribute__ (( __format__(__printf__,2,3) )) {}
+};
+
diff --git a/test/Parser/cxx-parse-member-pointer-op.cpp b/test/Parser/cxx-parse-member-pointer-op.cpp deleted file mode 100644 index cc2e8b1..0000000 --- a/test/Parser/cxx-parse-member-pointer-op.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// RUN: clang-cc -fsyntax-only -pedantic -verify %s - -struct C {}; - -typedef void (C::*pmfc)(); - -void g(pmfc) { - C *c; - c->*pmfc(); // expected-error {{invalid use of pointer to member type after '->*'}} - C c1; - c1.*pmfc(); // expected-error {{invalid use of pointer to member type after '.*'}} -} - diff --git a/test/Parser/cxx-template-decl.cpp b/test/Parser/cxx-template-decl.cpp index 2b2d3de..644f0de 100644 --- a/test/Parser/cxx-template-decl.cpp +++ b/test/Parser/cxx-template-decl.cpp @@ -1,11 +1,11 @@ -// RUN: clang-cc -fsyntax-only -verify -fms-extensions=0 %s +// RUN: clang-cc -fsyntax-only -verify %s // Errors export class foo { }; // expected-error {{expected template}} template x; // expected-error {{C++ requires a type specifier for all declarations}} \ // expected-error {{does not refer}} export template x; // expected-error {{expected '<' after 'template'}} -export template<class T> class x0; // expected-note {{exported templates are unsupported}} +export template<class T> class x0; // expected-warning {{exported templates are unsupported}} template < ; // expected-error {{parse error}} expected-error {{declaration does not declare anything}} template <template X> struct Err1; // expected-error {{expected '<' after 'template'}} \ // expected-error{{extraneous}} diff --git a/test/Parser/cxx-using-declaration.cpp b/test/Parser/cxx-using-declaration.cpp index a2bc8c5..461b9e5 100644 --- a/test/Parser/cxx-using-declaration.cpp +++ b/test/Parser/cxx-using-declaration.cpp @@ -1,4 +1,3 @@ -// FIXME: Disabled, appears to have undefined behavior, and needs to be updated to match new warnings. // RUN: clang-cc -fsyntax-only -verify %s // XFAIL: * @@ -12,7 +11,7 @@ using A::VA; using A::FA; using typename A::SA; -void main() +int main() { VA = 1; FA(); @@ -35,7 +34,7 @@ namespace E { template <typename TYPE> int funcE(TYPE arg) { return(arg); } } -using E::funcE<int>; // expected-error{{use of template specialization in using directive not allowed}} +using E::funcE<int>; // expected-error{{using declaration can not refer to a template specialization}} namespace F { struct X; diff --git a/test/Parser/cxx0x-attributes.cpp b/test/Parser/cxx0x-attributes.cpp new file mode 100644 index 0000000..a66e3e0 --- /dev/null +++ b/test/Parser/cxx0x-attributes.cpp @@ -0,0 +1,61 @@ +// RUN: clang-cc -fsyntax-only -verify -std=c++0x %s + +// Declaration syntax checks +[[]] int before_attr; +int after_attr [[]]; +int * [[]] ptr_attr; +int array_attr [1] [[]]; +[[align(8)]] int aligned_attr; +[[test::valid(for 42 [very] **** '+' symbols went on a trip; the end.)]] + int garbage_attr; +void fn_attr () [[]]; +class [[]] class_attr {}; +extern "C++" [[]] int extern_attr; +template <typename T> [[]] void template_attr (); + +int comma_attr [[,]]; // expected-error {{expected identifier}} +int scope_attr [[foo::]]; // expected-error {{expected identifier}} +int & [[]] ref_attr = after_attr; // expected-error {{an attribute list cannot appear here}} +class foo { + void after_const_attr () const [[]]; // expected-error {{expected expression}} +}; +extern "C++" [[]] { } // expected-error {{an attribute list cannot appear here}} +[[]] template <typename T> void before_template_attr (); // expected-error {{an attribute list cannot appear here}} +[[]] namespace ns { int i; } // expected-error {{an attribute list cannot appear here}} +[[]] static_assert(true, ""); //expected-error {{an attribute list cannot appear here}} +[[]] asm(""); // expected-error {{an attribute list cannot appear here}} + +[[]] using ns::i; // expected-error {{an attribute list cannot appear here}} +[[]] using namespace ns; + +// Argument tests +[[final()]] int final_params; // expected-error {{C++0x attribute 'final' cannot have an argument list}} +[[align]] int aligned_no_params; // expected-error {{C++0x attribute 'align' must have an argument list}} +[[align(i)]] int aligned_nonconst; // expected-error {{'aligned' attribute requires integer constant}} + +// Statement tests +void foo () { + [[]] ; + [[]] { } + [[]] if (0) { } + [[]] for (;;); + [[]] do { + [[]] continue; + } while (0); + [[]] while (0); + + [[]] switch (i) { + [[]] case 0: + [[]] default: + [[]] break; + } + + [[]] goto there; + [[]] there: + + [[]] try { + } [[]] catch (...) { // expected-error {{an attribute list cannot appear here}} + } + + [[]] return; +} diff --git a/test/Parser/cxx0x-literal-operators.cpp b/test/Parser/cxx0x-literal-operators.cpp new file mode 100644 index 0000000..c551460 --- /dev/null +++ b/test/Parser/cxx0x-literal-operators.cpp @@ -0,0 +1,5 @@ +// RUN: clang-cc -fsyntax-only -verify -std=c++0x %s + +void operator "" (); // expected-error {{expected identifier}} +void operator "k" foo(); // expected-error {{string literal after 'operator' must be '""'}} +void operator "" tester (int); diff --git a/test/Parser/if-scope-c90.c b/test/Parser/if-scope-c90.c index 53987dc..c372f0f 100644 --- a/test/Parser/if-scope-c90.c +++ b/test/Parser/if-scope-c90.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify --std=c90 %s +// RUN: clang-cc -fsyntax-only -verify -std=c90 %s int f (int z) { diff --git a/test/Parser/if-scope-c99.c b/test/Parser/if-scope-c99.c index b4cb51c..0cb2495 100644 --- a/test/Parser/if-scope-c99.c +++ b/test/Parser/if-scope-c99.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify --std=c99 %s +// RUN: clang-cc -fsyntax-only -verify -std=c99 %s int f (int z) { diff --git a/test/Preprocessor/assembler-with-cpp.c b/test/Preprocessor/assembler-with-cpp.c index 693d5b8..17880c8 100644 --- a/test/Preprocessor/assembler-with-cpp.c +++ b/test/Preprocessor/assembler-with-cpp.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -x assembler-with-cpp -fdollars-in-identifiers=0 -E %s -o - | FileCheck -strict-whitespace -check-prefix=CHECK-Identifiers-False %s +// RUN: clang-cc -x assembler-with-cpp -E %s -o - | FileCheck -strict-whitespace -check-prefix=CHECK-Identifiers-False %s #ifndef __ASSEMBLER__ #error "__ASSEMBLER__ not defined" @@ -49,7 +49,7 @@ 6: FOO(blarg) // CHECK-Identifiers-False: 6: blarg $foo -// RUN: clang-cc -x assembler-with-cpp -fdollars-in-identifiers=1 -E %s -o - | FileCheck -check-prefix=CHECK-Identifiers-True -strict-whitespace %s +// RUN: clang-cc -x assembler-with-cpp -fdollars-in-identifiers -E %s -o - | FileCheck -check-prefix=CHECK-Identifiers-True -strict-whitespace %s #define FOO(name) name ## $foo 7: FOO(blarg) // CHECK-Identifiers-True: 7: blarg$foo diff --git a/test/Preprocessor/cxx_true.cpp b/test/Preprocessor/cxx_true.cpp index 80aa04e..bca70c5 100644 --- a/test/Preprocessor/cxx_true.cpp +++ b/test/Preprocessor/cxx_true.cpp @@ -1,6 +1,6 @@ -/* RUN: clang-cc -E %s -x=c++ | grep block_1 - RUN: clang-cc -E %s -x=c++ | not grep block_2 - RUN: clang-cc -E %s -x=c | not grep block +/* RUN: clang-cc -E %s -x c++ | grep block_1 + RUN: clang-cc -E %s -x c++ | not grep block_2 + RUN: clang-cc -E %s -x c | not grep block */ #if true diff --git a/test/Preprocessor/feature_tests.c b/test/Preprocessor/feature_tests.c index dbfde4b..9ccff0e 100644 --- a/test/Preprocessor/feature_tests.c +++ b/test/Preprocessor/feature_tests.c @@ -1,5 +1,5 @@ -// RUN: clang-cc %s --triple=i686-apple-darwin9 -// RUN: clang-cc %s -E --triple=i686-apple-darwin9 +// RUN: clang-cc %s -triple=i686-apple-darwin9 +// RUN: clang-cc %s -E -triple=i686-apple-darwin9 #ifndef __has_feature #error Should have __has_feature #endif diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index aae218d..163734e 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -E -dM -x=assembler-with-cpp < /dev/null | FileCheck -check-prefix ASM %s +// RUN: clang-cc -E -dM -x assembler-with-cpp < /dev/null | FileCheck -check-prefix ASM %s // // ASM:#define __ASSEMBLER__ 1 // @@ -9,7 +9,7 @@ // BLOCKS:#define __block __attribute__((__blocks__(byref))) // // -// RUN: clang-cc -x=c++ -std=c++0x -E -dM < /dev/null | FileCheck -check-prefix CXX0X %s +// RUN: clang-cc -x c++ -std=c++0x -E -dM < /dev/null | FileCheck -check-prefix CXX0X %s // // CXX0X:#define _GNU_SOURCE 1 // CXX0X:#define __DEPRECATED 1 @@ -20,7 +20,7 @@ // CXX0X:#define __private_extern__ extern // // -// RUN: clang-cc -x=c++ -std=c++98 -E -dM < /dev/null | FileCheck -check-prefix CXX98 %s +// RUN: clang-cc -x c++ -std=c++98 -E -dM < /dev/null | FileCheck -check-prefix CXX98 %s // // CXX98:#define _GNU_SOURCE 1 // CXX98:#define __DEPRECATED 1 @@ -36,7 +36,7 @@ // C99:#define __STRICT_ANSI__ 1 // // -// RUN: clang-cc -E -dM -fms-extensions=0 < /dev/null | FileCheck -check-prefix COMMON %s +// RUN: clang-cc -E -dM < /dev/null | FileCheck -check-prefix COMMON %s // // COMMON:#define __CONSTANT_CFSTRINGS__ 1 // COMMON:#define __FINITE_MATH_ONLY__ 0 @@ -56,7 +56,7 @@ // RUN: clang-cc -ffreestanding -E -dM < /dev/null | FileCheck -check-prefix FREESTANDING %s // FREESTANDING:#define __STDC_HOSTED__ 0 // -// RUN: clang-cc -x=c++ -std=gnu++98 -E -dM < /dev/null | FileCheck -check-prefix GXX98 %s +// RUN: clang-cc -x c++ -std=gnu++98 -E -dM < /dev/null | FileCheck -check-prefix GXX98 %s // // GXX98:#define _GNU_SOURCE 1 // GXX98:#define __DEPRECATED 1 @@ -80,19 +80,19 @@ // MSEXT:#define __int8 __INT8_TYPE__ // // -// RUN: clang-cc -x=objective-c -E -dM < /dev/null | FileCheck -check-prefix OBJC %s +// RUN: clang-cc -x objective-c -E -dM < /dev/null | FileCheck -check-prefix OBJC %s // // OBJC:#define OBJC_NEW_PROPERTIES 1 // OBJC:#define __NEXT_RUNTIME__ 1 // OBJC:#define __OBJC__ 1 // // -// RUN: clang-cc -x=objective-c -fobjc-gc -E -dM < /dev/null | FileCheck -check-prefix OBJCGC %s +// RUN: clang-cc -x objective-c -fobjc-gc -E -dM < /dev/null | FileCheck -check-prefix OBJCGC %s // // OBJCGC:#define __OBJC_GC__ 1 // // -// RUN: clang-cc -x=objective-c -fobjc-nonfragile-abi -E -dM < /dev/null | FileCheck -check-prefix NONFRAGILE %s +// RUN: clang-cc -x objective-c -fobjc-nonfragile-abi -E -dM < /dev/null | FileCheck -check-prefix NONFRAGILE %s // // NONFRAGILE:#define OBJC_ZEROCOST_EXCEPTIONS 1 // NONFRAGILE:#define __OBJC2__ 1 @@ -108,7 +108,7 @@ // PASCAL:#define __PASCAL_STRINGS__ 1 // // -// RUN: clang-cc -fsigned-char -E -dM -fms-extensions=0 < /dev/null | FileCheck -check-prefix SCHAR %s +// RUN: clang-cc -E -dM < /dev/null | FileCheck -check-prefix SCHAR %s // // SCHAR:#define __STDC__ 1 // SCHAR-NOT:#define __UNSIGNED_CHAR__ @@ -155,6 +155,7 @@ // ARM:#define __INT64_TYPE__ long long int // ARM:#define __INT8_TYPE__ char // ARM:#define __INTMAX_MAX__ 9223372036854775807LL +// ARM:#define __INTMAX_TYPE__ long long int // ARM:#define __INTMAX_WIDTH__ 64 // ARM:#define __INTPTR_TYPE__ long int // ARM:#define __INTPTR_WIDTH__ 32 @@ -178,15 +179,21 @@ // ARM:#define __NO_INLINE__ 1 // ARM:#define __POINTER_WIDTH__ 32 // ARM:#define __PTRDIFF_TYPE__ int +// ARM:#define __PTRDIFF_WIDTH__ 32 // ARM:#define __SCHAR_MAX__ 127 // ARM:#define __SHRT_MAX__ 32767 +// ARM:#define __SIG_ATOMIC_WIDTH__ 32 // ARM:#define __SIZE_TYPE__ unsigned int +// ARM:#define __SIZE_WIDTH__ 32 // ARM:#define __THUMB_INTERWORK__ 1 +// ARM:#define __UINTMAX_TYPE__ long long unsigned int // ARM:#define __USER_LABEL_PREFIX__ _ // ARM:#define __VFP_FP__ 1 // ARM:#define __WCHAR_MAX__ 2147483647 // ARM:#define __WCHAR_TYPE__ int +// ARM:#define __WCHAR_WIDTH__ 32 // ARM:#define __WINT_TYPE__ int +// ARM:#define __WINT_WIDTH__ 32 // ARM:#define __arm 1 // ARM:#define __arm__ 1 // @@ -233,6 +240,7 @@ // BFIN:#define __INT64_TYPE__ long long int // BFIN:#define __INT8_TYPE__ char // BFIN:#define __INTMAX_MAX__ 9223372036854775807LL +// BFIN:#define __INTMAX_TYPE__ long long int // BFIN:#define __INTMAX_WIDTH__ 64 // BFIN:#define __INTPTR_TYPE__ long int // BFIN:#define __INTPTR_WIDTH__ 32 @@ -255,13 +263,19 @@ // BFIN:#define __NO_INLINE__ 1 // BFIN:#define __POINTER_WIDTH__ 32 // BFIN:#define __PTRDIFF_TYPE__ long int +// BFIN:#define __PTRDIFF_WIDTH__ 32 // BFIN:#define __SCHAR_MAX__ 127 // BFIN:#define __SHRT_MAX__ 32767 +// BFIN:#define __SIG_ATOMIC_WIDTH__ 32 // BFIN:#define __SIZE_TYPE__ long unsigned int +// BFIN:#define __SIZE_WIDTH__ 32 +// BFIN:#define __UINTMAX_TYPE__ long long unsigned int // BFIN:#define __USER_LABEL_PREFIX__ _ // BFIN:#define __WCHAR_MAX__ 2147483647 // BFIN:#define __WCHAR_TYPE__ int +// BFIN:#define __WCHAR_WIDTH__ 32 // BFIN:#define __WINT_TYPE__ int +// BFIN:#define __WINT_WIDTH__ 32 // BFIN:#define __bfin 1 // BFIN:#define __bfin__ 1 // BFIN:#define bfin 1 @@ -304,6 +318,7 @@ // I386:#define __INT64_TYPE__ long long int // I386:#define __INT8_TYPE__ char // I386:#define __INTMAX_MAX__ 9223372036854775807LL +// I386:#define __INTMAX_TYPE__ long long int // I386:#define __INTMAX_WIDTH__ 64 // I386:#define __INTPTR_TYPE__ int // I386:#define __INTPTR_WIDTH__ 32 @@ -328,14 +343,20 @@ // I386:#define __NO_MATH_INLINES 1 // I386:#define __POINTER_WIDTH__ 32 // I386:#define __PTRDIFF_TYPE__ int +// I386:#define __PTRDIFF_WIDTH__ 32 // I386:#define __REGISTER_PREFIX__ // I386:#define __SCHAR_MAX__ 127 // I386:#define __SHRT_MAX__ 32767 +// I386:#define __SIG_ATOMIC_WIDTH__ 32 // I386:#define __SIZE_TYPE__ unsigned int +// I386:#define __SIZE_WIDTH__ 32 +// I386:#define __UINTMAX_TYPE__ long long unsigned int // I386:#define __USER_LABEL_PREFIX__ _ // I386:#define __WCHAR_MAX__ 2147483647 // I386:#define __WCHAR_TYPE__ int +// I386:#define __WCHAR_WIDTH__ 32 // I386:#define __WINT_TYPE__ int +// I386:#define __WINT_WIDTH__ 32 // I386:#define __i386 1 // I386:#define __i386__ 1 // I386:#define __nocona 1 @@ -381,6 +402,7 @@ // MSP430:#define __INT32_TYPE__ long int // MSP430:#define __INT8_TYPE__ char // MSP430:#define __INTMAX_MAX__ 2147483647L +// MSP430:#define __INTMAX_TYPE__ long int // MSP430:#define __INTMAX_WIDTH__ 32 // MSP430:#define __INTPTR_TYPE__ short // MSP430:#define __INTPTR_WIDTH__ 16 @@ -404,13 +426,19 @@ // MSP430:#define __NO_INLINE__ 1 // MSP430:#define __POINTER_WIDTH__ 16 // MSP430:#define __PTRDIFF_TYPE__ int +// MSP430:#define __PTRDIFF_WIDTH__ 16 // MSP430:#define __SCHAR_MAX__ 127 // MSP430:#define __SHRT_MAX__ 32767 +// MSP430:#define __SIG_ATOMIC_WIDTH__ 32 // MSP430:#define __SIZE_TYPE__ unsigned int +// MSP430:#define __SIZE_WIDTH__ 16 +// MSP430:#define __UINTMAX_TYPE__ long unsigned int // MSP430:#define __USER_LABEL_PREFIX__ _ // MSP430:#define __WCHAR_MAX__ 32767 // MSP430:#define __WCHAR_TYPE__ int +// MSP430:#define __WCHAR_WIDTH__ 16 // MSP430:#define __WINT_TYPE__ int +// MSP430:#define __WINT_WIDTH__ 16 // MSP430:#define __clang__ 1 // // RUN: clang-cc -E -dM -ffreestanding -triple=pic16-none-none < /dev/null | FileCheck -check-prefix PIC16 %s @@ -451,6 +479,7 @@ // PIC16:#define __INT32_TYPE__ long int // PIC16:#define __INT8_TYPE__ char // PIC16:#define __INTMAX_MAX__ 2147483647L +// PIC16:#define __INTMAX_TYPE__ long int // PIC16:#define __INTMAX_WIDTH__ 32 // PIC16:#define __INTPTR_TYPE__ short // PIC16:#define __INTPTR_WIDTH__ 16 @@ -473,13 +502,19 @@ // PIC16:#define __NO_INLINE__ 1 // PIC16:#define __POINTER_WIDTH__ 16 // PIC16:#define __PTRDIFF_TYPE__ int +// PIC16:#define __PTRDIFF_WIDTH__ 16 // PIC16:#define __SCHAR_MAX__ 127 // PIC16:#define __SHRT_MAX__ 32767 +// PIC16:#define __SIG_ATOMIC_WIDTH__ 32 // PIC16:#define __SIZE_TYPE__ unsigned int +// PIC16:#define __SIZE_WIDTH__ 16 +// PIC16:#define __UINTMAX_TYPE__ long unsigned int // PIC16:#define __USER_LABEL_PREFIX__ _ // PIC16:#define __WCHAR_MAX__ 32767 // PIC16:#define __WCHAR_TYPE__ int +// PIC16:#define __WCHAR_WIDTH__ 16 // PIC16:#define __WINT_TYPE__ int +// PIC16:#define __WINT_WIDTH__ 16 // PIC16:#define __clang__ 1 // PIC16:#define __llvm__ 1 // PIC16:#define __pic16 1 @@ -489,7 +524,7 @@ // PIC16:#define ram __attribute__((address_space(0))) // PIC16:#define rom __attribute__((address_space(1))) // -// RUN: clang-cc -E -dM -ffreestanding -triple=powerpc64-none-none -fsigned-char=0 < /dev/null | FileCheck -check-prefix PPC64 %s +// RUN: clang-cc -E -dM -ffreestanding -triple=powerpc64-none-none -fno-signed-char < /dev/null | FileCheck -check-prefix PPC64 %s // // PPC64:#define _ARCH_PPC 1 // PPC64:#define _ARCH_PPC64 1 @@ -533,6 +568,7 @@ // PPC64:#define __INT64_TYPE__ long int // PPC64:#define __INT8_TYPE__ char // PPC64:#define __INTMAX_MAX__ 9223372036854775807L +// PPC64:#define __INTMAX_TYPE__ long int // PPC64:#define __INTMAX_WIDTH__ 64 // PPC64:#define __INTPTR_TYPE__ long int // PPC64:#define __INTPTR_WIDTH__ 64 @@ -559,18 +595,24 @@ // PPC64:#define __POINTER_WIDTH__ 64 // PPC64:#define __POWERPC__ 1 // PPC64:#define __PTRDIFF_TYPE__ long int +// PPC64:#define __PTRDIFF_WIDTH__ 64 // PPC64:#define __REGISTER_PREFIX__ // PPC64:#define __SCHAR_MAX__ 127 // PPC64:#define __SHRT_MAX__ 32767 +// PPC64:#define __SIG_ATOMIC_WIDTH__ 32 // PPC64:#define __SIZE_TYPE__ long unsigned int +// PPC64:#define __SIZE_WIDTH__ 64 +// PPC64:#define __UINTMAX_TYPE__ long unsigned int // PPC64:#define __USER_LABEL_PREFIX__ _ // PPC64:#define __WCHAR_MAX__ 2147483647 // PPC64:#define __WCHAR_TYPE__ int +// PPC64:#define __WCHAR_WIDTH__ 32 // PPC64:#define __WINT_TYPE__ int +// PPC64:#define __WINT_WIDTH__ 32 // PPC64:#define __ppc64__ 1 // PPC64:#define __ppc__ 1 // -// RUN: clang-cc -E -dM -ffreestanding -triple=powerpc-none-none -fsigned-char=0 < /dev/null | FileCheck -check-prefix PPC %s +// RUN: clang-cc -E -dM -ffreestanding -triple=powerpc-none-none -fno-signed-char < /dev/null | FileCheck -check-prefix PPC %s // // PPC:#define _ARCH_PPC 1 // PPC:#define _BIG_ENDIAN 1 @@ -612,6 +654,7 @@ // PPC:#define __INT64_TYPE__ long long int // PPC:#define __INT8_TYPE__ char // PPC:#define __INTMAX_MAX__ 9223372036854775807LL +// PPC:#define __INTMAX_TYPE__ long long int // PPC:#define __INTMAX_WIDTH__ 64 // PPC:#define __INTPTR_TYPE__ long int // PPC:#define __INTPTR_WIDTH__ 32 @@ -637,17 +680,23 @@ // PPC:#define __POINTER_WIDTH__ 32 // PPC:#define __POWERPC__ 1 // PPC:#define __PTRDIFF_TYPE__ long int +// PPC:#define __PTRDIFF_WIDTH__ 32 // PPC:#define __REGISTER_PREFIX__ // PPC:#define __SCHAR_MAX__ 127 // PPC:#define __SHRT_MAX__ 32767 +// PPC:#define __SIG_ATOMIC_WIDTH__ 32 // PPC:#define __SIZE_TYPE__ long unsigned int +// PPC:#define __SIZE_WIDTH__ 32 +// PPC:#define __UINTMAX_TYPE__ long long unsigned int // PPC:#define __USER_LABEL_PREFIX__ _ // PPC:#define __WCHAR_MAX__ 2147483647 // PPC:#define __WCHAR_TYPE__ int +// PPC:#define __WCHAR_WIDTH__ 32 // PPC:#define __WINT_TYPE__ int +// PPC:#define __WINT_WIDTH__ 32 // PPC:#define __ppc__ 1 // -// RUN: clang-cc -E -dM -ffreestanding -triple=s390x-none-none -fsigned-char=0 < /dev/null | FileCheck -check-prefix S390X %s +// RUN: clang-cc -E -dM -ffreestanding -triple=s390x-none-none -fno-signed-char < /dev/null | FileCheck -check-prefix S390X %s // // S390X:#define __CHAR_BIT__ 8 // S390X:#define __CHAR_UNSIGNED__ 1 @@ -686,6 +735,7 @@ // S390X:#define __INT64_TYPE__ long int // S390X:#define __INT8_TYPE__ char // S390X:#define __INTMAX_MAX__ 9223372036854775807LL +// S390X:#define __INTMAX_TYPE__ long long int // S390X:#define __INTMAX_WIDTH__ 64 // S390X:#define __INTPTR_TYPE__ long int // S390X:#define __INTPTR_WIDTH__ 64 @@ -708,13 +758,19 @@ // S390X:#define __NO_INLINE__ 1 // S390X:#define __POINTER_WIDTH__ 64 // S390X:#define __PTRDIFF_TYPE__ long int +// S390X:#define __PTRDIFF_WIDTH__ 64 // S390X:#define __SCHAR_MAX__ 127 // S390X:#define __SHRT_MAX__ 32767 +// S390X:#define __SIG_ATOMIC_WIDTH__ 32 // S390X:#define __SIZE_TYPE__ long unsigned int +// S390X:#define __SIZE_WIDTH__ 64 +// S390X:#define __UINTMAX_TYPE__ long long unsigned int // S390X:#define __USER_LABEL_PREFIX__ _ // S390X:#define __WCHAR_MAX__ 2147483647 // S390X:#define __WCHAR_TYPE__ int +// S390X:#define __WCHAR_WIDTH__ 32 // S390X:#define __WINT_TYPE__ int +// S390X:#define __WINT_WIDTH__ 32 // S390X:#define __s390__ 1 // S390X:#define __s390x__ 1 // @@ -756,6 +812,7 @@ // SPARC:#define __INT64_TYPE__ long long int // SPARC:#define __INT8_TYPE__ char // SPARC:#define __INTMAX_MAX__ 9223372036854775807LL +// SPARC:#define __INTMAX_TYPE__ long long int // SPARC:#define __INTMAX_WIDTH__ 64 // SPARC:#define __INTPTR_TYPE__ long int // SPARC:#define __INTPTR_WIDTH__ 32 @@ -778,15 +835,21 @@ // SPARC:#define __NO_INLINE__ 1 // SPARC:#define __POINTER_WIDTH__ 32 // SPARC:#define __PTRDIFF_TYPE__ long int +// SPARC:#define __PTRDIFF_WIDTH__ 32 // SPARC:#define __REGISTER_PREFIX__ // SPARC:#define __SCHAR_MAX__ 127 // SPARC:#define __SHRT_MAX__ 32767 +// SPARC:#define __SIG_ATOMIC_WIDTH__ 32 // SPARC:#define __SIZE_TYPE__ long unsigned int +// SPARC:#define __SIZE_WIDTH__ 32 +// SPARC:#define __UINTMAX_TYPE__ long long unsigned int // SPARC:#define __USER_LABEL_PREFIX__ _ // SPARC:#define __VERSION__ "4.2.1 Compatible Clang Compiler" // SPARC:#define __WCHAR_MAX__ 2147483647 // SPARC:#define __WCHAR_TYPE__ int +// SPARC:#define __WCHAR_WIDTH__ 32 // SPARC:#define __WINT_TYPE__ int +// SPARC:#define __WINT_WIDTH__ 32 // SPARC:#define __sparc 1 // SPARC:#define __sparc__ 1 // SPARC:#define __sparcv8 1 @@ -828,6 +891,7 @@ // TCE:#define __INT32_TYPE__ int // TCE:#define __INT8_TYPE__ char // TCE:#define __INTMAX_MAX__ 2147483647L +// TCE:#define __INTMAX_TYPE__ long int // TCE:#define __INTMAX_WIDTH__ 32 // TCE:#define __INTPTR_TYPE__ int // TCE:#define __INTPTR_WIDTH__ 32 @@ -850,15 +914,21 @@ // TCE:#define __NO_INLINE__ 1 // TCE:#define __POINTER_WIDTH__ 32 // TCE:#define __PTRDIFF_TYPE__ int +// TCE:#define __PTRDIFF_WIDTH__ 32 // TCE:#define __SCHAR_MAX__ 127 // TCE:#define __SHRT_MAX__ 32767 +// TCE:#define __SIG_ATOMIC_WIDTH__ 32 // TCE:#define __SIZE_TYPE__ unsigned int +// TCE:#define __SIZE_WIDTH__ 32 // TCE:#define __TCE_V1__ 1 // TCE:#define __TCE__ 1 +// TCE:#define __UINTMAX_TYPE__ long unsigned int // TCE:#define __USER_LABEL_PREFIX__ _ // TCE:#define __WCHAR_MAX__ 2147483647 // TCE:#define __WCHAR_TYPE__ int +// TCE:#define __WCHAR_WIDTH__ 32 // TCE:#define __WINT_TYPE__ int +// TCE:#define __WINT_WIDTH__ 32 // TCE:#define __tce 1 // TCE:#define __tce__ 1 // TCE:#define tce 1 @@ -902,6 +972,7 @@ // X86_64:#define __INT64_TYPE__ long int // X86_64:#define __INT8_TYPE__ char // X86_64:#define __INTMAX_MAX__ 9223372036854775807L +// X86_64:#define __INTMAX_TYPE__ long int // X86_64:#define __INTMAX_WIDTH__ 64 // X86_64:#define __INTPTR_TYPE__ long int // X86_64:#define __INTPTR_WIDTH__ 64 @@ -928,18 +999,24 @@ // X86_64:#define __NO_MATH_INLINES 1 // X86_64:#define __POINTER_WIDTH__ 64 // X86_64:#define __PTRDIFF_TYPE__ long int +// X86_64:#define __PTRDIFF_WIDTH__ 64 // X86_64:#define __REGISTER_PREFIX__ // X86_64:#define __SCHAR_MAX__ 127 // X86_64:#define __SHRT_MAX__ 32767 +// X86_64:#define __SIG_ATOMIC_WIDTH__ 32 // X86_64:#define __SIZE_TYPE__ long unsigned int +// X86_64:#define __SIZE_WIDTH__ 64 // X86_64:#define __SSE2_MATH__ 1 // X86_64:#define __SSE2__ 1 // X86_64:#define __SSE_MATH__ 1 // X86_64:#define __SSE__ 1 +// X86_64:#define __UINTMAX_TYPE__ long unsigned int // X86_64:#define __USER_LABEL_PREFIX__ _ // X86_64:#define __WCHAR_MAX__ 2147483647 // X86_64:#define __WCHAR_TYPE__ int +// X86_64:#define __WCHAR_WIDTH__ 32 // X86_64:#define __WINT_TYPE__ int +// X86_64:#define __WINT_WIDTH__ 32 // X86_64:#define __amd64 1 // X86_64:#define __amd64__ 1 // X86_64:#define __nocona 1 diff --git a/test/Preprocessor/line-directive.c b/test/Preprocessor/line-directive.c index b79b1d9..33dd9bb 100644 --- a/test/Preprocessor/line-directive.c +++ b/test/Preprocessor/line-directive.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify -pedantic -fms-extensions=0 %s +// RUN: clang-cc -fsyntax-only -verify -pedantic %s // RUN: clang-cc -E %s 2>&1 | grep 'blonk.c:92:2: error: #error ABC' // RUN: clang-cc -E %s 2>&1 | grep 'blonk.c:93:2: error: #error DEF' diff --git a/test/Preprocessor/macro_paste_bcpl_comment.c b/test/Preprocessor/macro_paste_bcpl_comment.c index 0637a87..8bbee5d 100644 --- a/test/Preprocessor/macro_paste_bcpl_comment.c +++ b/test/Preprocessor/macro_paste_bcpl_comment.c @@ -1,4 +1,4 @@ -// RUN: clang-cc %s -Eonly -fms-extensions=0 2>&1 | grep error +// RUN: clang-cc %s -Eonly 2>&1 | grep error #define COMM1 / ## / COMM1 diff --git a/test/Preprocessor/stdint.c b/test/Preprocessor/stdint.c index 9c98e29..9304746 100644 --- a/test/Preprocessor/stdint.c +++ b/test/Preprocessor/stdint.c @@ -403,8 +403,8 @@ // // MSP430:SIG_ATOMIC_MIN_ (-2147483647L -1) // MSP430:SIG_ATOMIC_MAX_ 2147483647L -// MSP430:WINT_MIN_ (-2147483647L -1) -// MSP430:WINT_MAX_ 2147483647L +// MSP430:WINT_MIN_ (-32767 -1) +// MSP430:WINT_MAX_ 32767 // // MSP430:WCHAR_MAX_ 32767 // MSP430:WCHAR_MIN_ (-32767 -1) @@ -503,8 +503,8 @@ // // PIC16:SIG_ATOMIC_MIN_ (-2147483647L -1) // PIC16:SIG_ATOMIC_MAX_ 2147483647L -// PIC16:WINT_MIN_ (-2147483647L -1) -// PIC16:WINT_MAX_ 2147483647L +// PIC16:WINT_MIN_ (-32767 -1) +// PIC16:WINT_MAX_ 32767 // // PIC16:WCHAR_MAX_ 32767 // PIC16:WCHAR_MIN_ (-32767 -1) @@ -1158,6 +1158,35 @@ // X86_64:INTMAX_C_(0) 0L // X86_64:UINTMAX_C_(0) 0UL // +// +// stdint.h forms several macro definitions by pasting together identifiers +// to form names (eg. int32_t is formed from int ## 32 ## _t). The following +// case tests that these joining operations are performed correctly even if +// the identifiers used in the operations (int, uint, _t, INT, UINT, _MIN, +// _MAX, and _C(v)) are themselves macros. +// +// RUN: clang-cc -E -ffreestanding -Dint=a -Duint=b -D_t=c -DINT=d -DUINT=e -D_MIN=f -D_MAX=g '-D_C(v)=h' -triple=i386-none-none %s | FileCheck -check-prefix JOIN %s +// JOIN:typedef int32_t intptr_t; +// JOIN:typedef uint32_t uintptr_t; +// JOIN:typedef int64_t intmax_t; +// JOIN:typedef uint64_t uintmax_t; +// JOIN:INTPTR_MIN_ (-2147483647 -1) +// JOIN:INTPTR_MAX_ 2147483647 +// JOIN:UINTPTR_MAX_ 4294967295U +// JOIN:PTRDIFF_MIN_ (-2147483647 -1) +// JOIN:PTRDIFF_MAX_ 2147483647 +// JOIN:SIZE_MAX_ 4294967295U +// JOIN:INTMAX_MIN_ (-9223372036854775807LL -1) +// JOIN:INTMAX_MAX_ 9223372036854775807LL +// JOIN:UINTMAX_MAX_ 18446744073709551615ULL +// JOIN:SIG_ATOMIC_MIN_ (-2147483647 -1) +// JOIN:SIG_ATOMIC_MAX_ 2147483647 +// JOIN:WINT_MIN_ (-2147483647 -1) +// JOIN:WINT_MAX_ 2147483647 +// JOIN:WCHAR_MAX_ 2147483647 +// JOIN:WCHAR_MIN_ (-2147483647 -1) +// JOIN:INTMAX_C_(0) 0LL +// JOIN:UINTMAX_C_(0) 0ULL #include <stdint.h> diff --git a/test/Rewriter/id-test-3.m b/test/Rewriter/id-test-3.m index 7e4cc51d..aecabe6 100644 --- a/test/Rewriter/id-test-3.m +++ b/test/Rewriter/id-test-3.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @protocol P - (id<P>) Meth: (id<P>) Arg; diff --git a/test/Rewriter/ivar-encoding-1.m b/test/Rewriter/ivar-encoding-1.m index 7591461..10665b8 100644 --- a/test/Rewriter/ivar-encoding-1.m +++ b/test/Rewriter/ivar-encoding-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface Intf { diff --git a/test/Rewriter/ivar-encoding-2.m b/test/Rewriter/ivar-encoding-2.m index 86cc9b6..6cd0e27 100644 --- a/test/Rewriter/ivar-encoding-2.m +++ b/test/Rewriter/ivar-encoding-2.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @implementation Intf { diff --git a/test/Rewriter/metadata-test-1.m b/test/Rewriter/metadata-test-1.m index 40eded1..54413f2 100644 --- a/test/Rewriter/metadata-test-1.m +++ b/test/Rewriter/metadata-test-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface Intf @end diff --git a/test/Rewriter/metadata-test-2.m b/test/Rewriter/metadata-test-2.m index ab838f1..af26545 100644 --- a/test/Rewriter/metadata-test-2.m +++ b/test/Rewriter/metadata-test-2.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - typedef struct _NSPoint { float x; diff --git a/test/Rewriter/method-encoding-1.m b/test/Rewriter/method-encoding-1.m index 05df602..4726061 100644 --- a/test/Rewriter/method-encoding-1.m +++ b/test/Rewriter/method-encoding-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @protocol P1 - (void) MyProtoMeth : (int **) arg1 : (void*) arg2; diff --git a/test/Rewriter/objc-encoding-bug-1.m b/test/Rewriter/objc-encoding-bug-1.m index 684a0d2..d209988 100644 --- a/test/Rewriter/objc-encoding-bug-1.m +++ b/test/Rewriter/objc-encoding-bug-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - typedef struct NSMethodFrameArgInfo { struct NSMethodFrameArgInfo *subInfo; diff --git a/test/Rewriter/objc-string-concat-1.m b/test/Rewriter/objc-string-concat-1.m index e8f8a88..b1f95e0 100644 --- a/test/Rewriter/objc-string-concat-1.m +++ b/test/Rewriter/objc-string-concat-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @class NSString; diff --git a/test/Rewriter/objc-synchronized-1.m b/test/Rewriter/objc-synchronized-1.m index e3c4116..df24518 100644 --- a/test/Rewriter/objc-synchronized-1.m +++ b/test/Rewriter/objc-synchronized-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - id SYNCH_EXPR(); void SYNCH_BODY(); diff --git a/test/Rewriter/protocol-rewrite-1.m b/test/Rewriter/protocol-rewrite-1.m index 263a97d..3f2bb6f 100644 --- a/test/Rewriter/protocol-rewrite-1.m +++ b/test/Rewriter/protocol-rewrite-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - typedef struct MyWidget { int a; diff --git a/test/Rewriter/rewrite-api-bug.m b/test/Rewriter/rewrite-api-bug.m index ba0511b..e2dfe38 100644 --- a/test/Rewriter/rewrite-api-bug.m +++ b/test/Rewriter/rewrite-api-bug.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface MyDerived - (void) instanceMethod; diff --git a/test/Rewriter/rewrite-foreach-1.m b/test/Rewriter/rewrite-foreach-1.m index eef33f8..686d73f 100644 --- a/test/Rewriter/rewrite-foreach-1.m +++ b/test/Rewriter/rewrite-foreach-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @protocol P @end diff --git a/test/Rewriter/rewrite-foreach-2.m b/test/Rewriter/rewrite-foreach-2.m index 12f0e83..4de64bc 100644 --- a/test/Rewriter/rewrite-foreach-2.m +++ b/test/Rewriter/rewrite-foreach-2.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @protocol P @end diff --git a/test/Rewriter/rewrite-foreach-3.m b/test/Rewriter/rewrite-foreach-3.m index 3aa0d95..0de3102 100644 --- a/test/Rewriter/rewrite-foreach-3.m +++ b/test/Rewriter/rewrite-foreach-3.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @protocol P @end diff --git a/test/Rewriter/rewrite-foreach-4.m b/test/Rewriter/rewrite-foreach-4.m index 5c831ea..70f3eb8 100644 --- a/test/Rewriter/rewrite-foreach-4.m +++ b/test/Rewriter/rewrite-foreach-4.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface MyList - (id) allKeys; diff --git a/test/Rewriter/rewrite-foreach-5.m b/test/Rewriter/rewrite-foreach-5.m index d03f6ce..14d18d1 100644 --- a/test/Rewriter/rewrite-foreach-5.m +++ b/test/Rewriter/rewrite-foreach-5.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface MyList - (id) allKeys; diff --git a/test/Rewriter/rewrite-foreach-6.m b/test/Rewriter/rewrite-foreach-6.m index c6043bb..66d4110 100644 --- a/test/Rewriter/rewrite-foreach-6.m +++ b/test/Rewriter/rewrite-foreach-6.m @@ -1,4 +1,4 @@ -// RUN: clang-cc %s -rewrite-objc -o=- +// RUN: clang-cc %s -rewrite-objc -o - // rdar://5716356 // FIXME: Should be able to pipe into clang, but code is not // yet correct for other reasons: rdar://5716940 diff --git a/test/Rewriter/rewrite-nest.m b/test/Rewriter/rewrite-nest.m index 7a1690a..e35baf6 100644 --- a/test/Rewriter/rewrite-nest.m +++ b/test/Rewriter/rewrite-nest.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface NSMapTable @end @interface NSEnumerator @end diff --git a/test/Rewriter/rewrite-protocol-type-1.m b/test/Rewriter/rewrite-protocol-type-1.m index 48dc029..63b605d 100644 --- a/test/Rewriter/rewrite-protocol-type-1.m +++ b/test/Rewriter/rewrite-protocol-type-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @protocol MyProto1 @end diff --git a/test/Rewriter/rewrite-try-catch.m b/test/Rewriter/rewrite-try-catch.m index 8c6d08f..f69e8ef 100644 --- a/test/Rewriter/rewrite-try-catch.m +++ b/test/Rewriter/rewrite-try-catch.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface Foo @end @interface GARF @end diff --git a/test/Rewriter/static-type-protocol-1.m b/test/Rewriter/static-type-protocol-1.m index 0985a9d..986627d 100644 --- a/test/Rewriter/static-type-protocol-1.m +++ b/test/Rewriter/static-type-protocol-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @protocol Proto - (void) ProtoDidget; diff --git a/test/Rewriter/undecl-objc-h.m b/test/Rewriter/undecl-objc-h.m index b097651..12f3811 100644 --- a/test/Rewriter/undecl-objc-h.m +++ b/test/Rewriter/undecl-objc-h.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - typedef struct S { int * pint; diff --git a/test/Rewriter/undeclared-method-1.m b/test/Rewriter/undeclared-method-1.m index 795fd61..499d911 100644 --- a/test/Rewriter/undeclared-method-1.m +++ b/test/Rewriter/undeclared-method-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface Derived @end diff --git a/test/Rewriter/undef-field-reference-1.m b/test/Rewriter/undef-field-reference-1.m index 43bc2ad..17f448d 100644 --- a/test/Rewriter/undef-field-reference-1.m +++ b/test/Rewriter/undef-field-reference-1.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - @interface MyDerived { diff --git a/test/Rewriter/va-method.m b/test/Rewriter/va-method.m index 3bee599..b4fdac5 100644 --- a/test/Rewriter/va-method.m +++ b/test/Rewriter/va-method.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -rewrite-objc %s -o=- +// RUN: clang-cc -rewrite-objc %s -o - #include <stdarg.h> diff --git a/test/Sema/align-arm-apcs.c b/test/Sema/align-arm-apcs.c index 924ba90..9689906 100644 --- a/test/Sema/align-arm-apcs.c +++ b/test/Sema/align-arm-apcs.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -triple arm-unknown-unknown -target-abi=apcs-gnu -fsyntax-only -verify %s +// RUN: clang-cc -triple arm-unknown-unknown -target-abi apcs-gnu -fsyntax-only -verify %s struct s0 { double f0; int f1; }; char chk0[__alignof__(struct s0) == 4 ? 1 : -1]; diff --git a/test/Sema/altivec-init.c b/test/Sema/altivec-init.c index 6185186..2a33e1e 100644 --- a/test/Sema/altivec-init.c +++ b/test/Sema/altivec-init.c @@ -1,4 +1,4 @@ -// RUN: clang-cc %s -faltivec -verify -pedantic -fsyntax-only -fblocks=0 +// RUN: clang-cc %s -faltivec -verify -pedantic -fsyntax-only typedef int v4 __attribute((vector_size(16))); typedef short v8 __attribute((vector_size(16))); diff --git a/test/Sema/carbon.c b/test/Sema/carbon.c index 5eda438..8292ba8 100644 --- a/test/Sema/carbon.c +++ b/test/Sema/carbon.c @@ -1,4 +1,4 @@ -// RUN: clang-cc -mcpu=pentium4 %s -print-stats +// RUN: clang-cc -mcpu pentium4 %s -print-stats #ifdef __APPLE__ #include <Carbon/Carbon.h> #endif diff --git a/test/Sema/cast.c b/test/Sema/cast.c index ec19626..d2e3e0c 100644 --- a/test/Sema/cast.c +++ b/test/Sema/cast.c @@ -12,3 +12,7 @@ void bar() { a = (char*)b; // expected-error {{cannot be cast to a pointer type}} } +long bar1(long *next) { + return (long)(*next)++; +} + diff --git a/test/Sema/exprs.c b/test/Sema/exprs.c index 2bcc0f8..299b0a2 100644 --- a/test/Sema/exprs.c +++ b/test/Sema/exprs.c @@ -1,4 +1,4 @@ -// RUN: clang-cc %s -verify -pedantic -fsyntax-only -fblocks=0 +// RUN: clang-cc %s -verify -pedantic -fsyntax-only // PR1966 _Complex double test1() { diff --git a/test/Sema/switch.c b/test/Sema/switch.c index 122947e..3ee3712 100644 --- a/test/Sema/switch.c +++ b/test/Sema/switch.c @@ -1,5 +1,4 @@ // RUN: clang-cc -fsyntax-only -verify %s - void f (int z) { while (z) { default: z--; // expected-error {{statement not in switch}} @@ -75,3 +74,14 @@ void test6() { break; } } + +// PR5606 +int f0(int var) { + switch (va) { // expected-error{{use of undeclared identifier 'va'}} + case 1: + break; + case 2: + return 1; + } + return 2; +} diff --git a/test/Sema/wchar.c b/test/Sema/wchar.c index e201c7e..ed6649a 100644 --- a/test/Sema/wchar.c +++ b/test/Sema/wchar.c @@ -6,7 +6,9 @@ typedef __WCHAR_TYPE__ wchar_t; #if defined(_WIN32) || defined(_M_IX86) || defined(__CYGWIN__) \ || defined(_M_X64) || defined(SHORT_WCHAR) #define WCHAR_T_TYPE unsigned short -#else +#elif defined(__sun) || defined(__AuroraUX__) + #define WCHAR_T_TYPE long +#else /* Solaris or AuroraUX. */ #define WCHAR_T_TYPE int #endif diff --git a/test/SemaCXX/alignof-sizeof-reference.cpp b/test/SemaCXX/alignof-sizeof-reference.cpp new file mode 100644 index 0000000..27d98ab --- /dev/null +++ b/test/SemaCXX/alignof-sizeof-reference.cpp @@ -0,0 +1,9 @@ +// RUN: clang-cc -std=c++0x -fsyntax-only -verify %s + +struct s0; // expected-note {{forward declaration}} +char ar[sizeof(s0&)]; // expected-error {{invalid application of 'sizeof' to an incomplete type}} +void test() { + char &r = ar[0]; + static_assert(alignof(r) == 1, "bad alignment"); + static_assert(sizeof(r) == 1, "bad size"); +} diff --git a/test/SemaCXX/attr-cxx0x.cpp b/test/SemaCXX/attr-cxx0x.cpp new file mode 100644 index 0000000..da52d33 --- /dev/null +++ b/test/SemaCXX/attr-cxx0x.cpp @@ -0,0 +1,36 @@ +// RUN: clang-cc -fsyntax-only -verify -std=c++0x %s + +int final_fail [[final]]; //expected-error {{'final' attribute only applies to virtual method or class types}} + +struct [[final]] final_base { }; // expected-note {{struct final_base declared here}} +struct final_child : final_base { }; // expected-error {{derivation from 'final' struct final_base}} + +struct final_member { virtual void quux [[final]] (); }; // expected-note {{overridden virtual function is here}} +struct final_override : final_member { virtual void quux (); }; // expected-error {{declaration of 'quux' overrides a 'final' function}} + +int align_illegal [[align(3)]]; //expected-error {{requested alignment is not a power of 2}} +char align_big [[align(int)]]; +int align_small [[align(1)]]; +int align_multiple [[align(1), align(8), align(1)]]; + +struct align_member { + int member [[align(8)]]; +}; + +static_assert(alignof(align_big) == alignof(int), "k's alignment is wrong"); +static_assert(alignof(align_small) == alignof(int), "j's alignment is wrong"); +static_assert(alignof(align_multiple) == 8, "l's alignment is wrong"); +static_assert(alignof(align_member) == 8, "quuux's alignment is wrong"); +static_assert(sizeof(align_member) == 8, "quuux's size is wrong"); + +int bc_fail [[base_check]]; // expected-error {{'base_check' attribute only applies to class types}} +int hiding_fail [[hiding]]; // expected-error {{'hiding' attribute only applies to member types}} +int override_fail [[override]]; // expected-error {{'override' attribute only applies to virtual method types}} + +struct base { + virtual void function(); + virtual void other_function(); +}; + +struct [[base_check, base_check]] bc : base { // expected-error {{'base_check' attribute cannot be repeated}} +};
\ No newline at end of file diff --git a/test/SemaCXX/attr-sentinel.cpp b/test/SemaCXX/attr-sentinel.cpp new file mode 100644 index 0000000..0293a5d --- /dev/null +++ b/test/SemaCXX/attr-sentinel.cpp @@ -0,0 +1,6 @@ +// RUN: clang-cc -fsyntax-only -verify %s +void f(int, ...) __attribute__((sentinel)); + +void g() { + f(1, 2, __null); +} diff --git a/test/SemaCXX/class-layout.cpp b/test/SemaCXX/class-layout.cpp index 56f41bf..b597172 100644 --- a/test/SemaCXX/class-layout.cpp +++ b/test/SemaCXX/class-layout.cpp @@ -47,3 +47,20 @@ struct G { G(); }; struct H : G { }; SA(6, sizeof(H) == 1); + +// PR5580 +namespace PR5580 { + +class A { bool iv0 : 1; }; +SA(7, sizeof(A) == 1); + +class B : A { bool iv0 : 1; }; +SA(8, sizeof(B) == 2); + +struct C { bool iv0 : 1; }; +SA(9, sizeof(C) == 1); + +struct D : C { bool iv0 : 1; }; +SA(10, sizeof(D) == 2); + +} diff --git a/test/SemaCXX/class.cpp b/test/SemaCXX/class.cpp index d2a8114..2637f32 100644 --- a/test/SemaCXX/class.cpp +++ b/test/SemaCXX/class.cpp @@ -110,3 +110,11 @@ struct C4 { void f(); // expected-note{{previous declaration is here}} int f; // expected-error{{duplicate member 'f'}} }; + +// PR5415 - don't hang! +struct S +{ + void f(); // expected-note 1 {{previous declaration}} + void S::f() {} // expected-error {{class member cannot be redeclared}} expected-note {{previous declaration}} expected-note {{previous definition}} + void f() {} // expected-error {{class member cannot be redeclared}} expected-error {{redefinition}} +}; diff --git a/test/SemaCXX/condition.cpp b/test/SemaCXX/condition.cpp index 7c9cee5..b2645d4 100644 --- a/test/SemaCXX/condition.cpp +++ b/test/SemaCXX/condition.cpp @@ -33,3 +33,11 @@ void test() { for (; int x=0; ) { int x; } // expected-error {{redefinition of 'x'}} expected-note {{previous definition is here}} switch (int x=0) { default: int x; } // expected-error {{redefinition of 'x'}} expected-note {{previous definition is here}} } + +int* get_int_ptr(); + +void test2() { + float *ip; + if (int *ip = ip) { + } +} diff --git a/test/SemaCXX/converting-constructor.cpp b/test/SemaCXX/converting-constructor.cpp index 59b793e..3f347b4 100644 --- a/test/SemaCXX/converting-constructor.cpp +++ b/test/SemaCXX/converting-constructor.cpp @@ -38,3 +38,10 @@ void explicit_constructor(short s) { FromShortExplicitly fse1(s); FromShortExplicitly fse2 = s; // expected-error{{error: cannot initialize 'fse2' with an lvalue of type 'short'}} } + +// PR5519 +struct X1 { X1(const char&); }; +void x1(X1); +void y1() { + x1(1); +} diff --git a/test/SemaCXX/implicit-int.cpp b/test/SemaCXX/implicit-int.cpp index 7230305..6fa8dd3 100644 --- a/test/SemaCXX/implicit-int.cpp +++ b/test/SemaCXX/implicit-int.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify -fms-extensions=0 %s +// RUN: clang-cc -fsyntax-only -verify %s x; // expected-error{{C++ requires a type specifier for all declarations}} diff --git a/test/SemaCXX/member-pointers-2.cpp b/test/SemaCXX/member-pointers-2.cpp new file mode 100644 index 0000000..fea1d74 --- /dev/null +++ b/test/SemaCXX/member-pointers-2.cpp @@ -0,0 +1,36 @@ +// RUN: clang-cc -emit-llvm-only %s + +// Tests that Sema properly creates member-access expressions for +// these instead of bare FieldDecls. + +struct Foo { + int myvalue; + + // We have to override these to get something with an lvalue result. + int &operator++(int); + int &operator--(int); +}; + +struct Test0 { + Foo memfoo; + int memint; + int memarr[10]; + Test0 *memptr; + struct MemClass { int a; } memstruct; + int &memfun(); + + void test() { + int *p; + p = &Test0::memfoo++; + p = &Test0::memfoo--; + p = &Test0::memarr[1]; + p = &Test0::memptr->memint; + p = &Test0::memstruct.a; + p = &Test0::memfun(); + } +}; + +void test0() { + Test0 mytest; + mytest.test(); +} diff --git a/test/SemaCXX/nested-name-spec.cpp b/test/SemaCXX/nested-name-spec.cpp index 721758f..83c72417 100644 --- a/test/SemaCXX/nested-name-spec.cpp +++ b/test/SemaCXX/nested-name-spec.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -std=c++98 -verify -fms-extensions=0 %s +// RUN: clang-cc -fsyntax-only -std=c++98 -verify %s namespace A { struct C { static int cx; @@ -87,7 +87,6 @@ void f3() { N::x = 0; // expected-error {{expected a class or namespace}} { int A; A::ax = 0; } { typedef int A; A::ax = 0; } // expected-error{{expected a class or namespace}} - { int A(); A::ax = 0; } { typedef A::C A; A::ax = 0; } // expected-error {{no member named 'ax'}} { typedef A::C A; A::cx = 0; } } diff --git a/test/SemaCXX/new-delete.cpp b/test/SemaCXX/new-delete.cpp index ededfc0..f2fe0a7 100644 --- a/test/SemaCXX/new-delete.cpp +++ b/test/SemaCXX/new-delete.cpp @@ -190,3 +190,15 @@ class X9 { void f(X9 *x9) { delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}} } + +struct X10 { + virtual ~X10(); +}; + +struct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}} + void operator delete(void*, int); // expected-note {{'operator delete' declared here}} +}; + +void f() { + X11 x11; // expected-note {{implicit default destructor for 'struct X11' first required here}} +} diff --git a/test/SemaCXX/pseudo-destructors.cpp b/test/SemaCXX/pseudo-destructors.cpp index 0850c44..8f69def 100644 --- a/test/SemaCXX/pseudo-destructors.cpp +++ b/test/SemaCXX/pseudo-destructors.cpp @@ -38,3 +38,12 @@ typedef int Integer; void destroy_without_call(int *ip) { ip->~Integer; // expected-error{{called immediately}} } + +// PR5530 +namespace N1 { + class X0 { }; +} + +void test_X0(N1::X0 &x0) { + x0.~X0(); +} diff --git a/test/SemaCXX/qual-id-test.cpp b/test/SemaCXX/qual-id-test.cpp index ecb6aa9..02e6999 100644 --- a/test/SemaCXX/qual-id-test.cpp +++ b/test/SemaCXX/qual-id-test.cpp @@ -48,7 +48,7 @@ namespace C a.A::sub::x(); a.A::B::base::x(); - a.bad::x(); // expected-error{{type 'struct bad' is not a direct or virtual base of ''struct A::sub''}} + a.bad::x(); // expected-error{{type 'struct bad' is not a direct or virtual base of ''A::sub''}} a->foo(); a->member::foo(); @@ -69,7 +69,7 @@ namespace C a->A::sub::x(); a->A::B::base::x(); - a->bad::x(); // expected-error{{type 'struct bad' is not a direct or virtual base of ''struct A::sub''}} + a->bad::x(); // expected-error{{type 'struct bad' is not a direct or virtual base of ''A::sub''}} (*a)->foo(); (*a)->member::foo(); diff --git a/test/SemaCXX/reinterpret-cast.cpp b/test/SemaCXX/reinterpret-cast.cpp index be960a3..bfe8887 100644 --- a/test/SemaCXX/reinterpret-cast.cpp +++ b/test/SemaCXX/reinterpret-cast.cpp @@ -1,5 +1,7 @@ // RUN: clang-cc -fsyntax-only -verify %s +#include <stdint.h> + enum test { testval = 1 }; struct structure { int m; }; typedef void (*fnptr)(); @@ -20,11 +22,11 @@ void self_conversion() void integral_conversion() { void *vp = reinterpret_cast<void*>(testval); - long l = reinterpret_cast<long>(vp); - (void)reinterpret_cast<float*>(l); - fnptr fnp = reinterpret_cast<fnptr>(l); + intptr_t i = reinterpret_cast<intptr_t>(vp); + (void)reinterpret_cast<float*>(i); + fnptr fnp = reinterpret_cast<fnptr>(i); (void)reinterpret_cast<char>(fnp); // expected-error {{cast from pointer to smaller type 'char' loses information}} - (void)reinterpret_cast<long>(fnp); + (void)reinterpret_cast<intptr_t>(fnp); } void pointer_conversion() diff --git a/test/SemaCXX/switch-0x.cpp b/test/SemaCXX/switch-0x.cpp new file mode 100644 index 0000000..c1f6bd9 --- /dev/null +++ b/test/SemaCXX/switch-0x.cpp @@ -0,0 +1,11 @@ +// RUN: clang-cc -fsyntax-only -verify -std=c++0x %s + +// PR5518 +struct A { + explicit operator int(); // expected-note{{conversion to integral type}} +}; + +void x() { + switch(A()) { // expected-error{{explicit conversion to}} + } +} diff --git a/test/SemaCXX/switch.cpp b/test/SemaCXX/switch.cpp index b22adb7..003d5b8 100644 --- a/test/SemaCXX/switch.cpp +++ b/test/SemaCXX/switch.cpp @@ -13,3 +13,30 @@ void test() { break; } } + +// PR5518 +struct A { + operator int(); // expected-note{{conversion to integral type}} +}; + +void x() { + switch(A()) { + } +} + +enum E { e1, e2 }; +struct B : A { + operator E() const; // expected-note{{conversion to enumeration type}} +}; + +void x2() { + switch (B()) { // expected-error{{multiple conversions}} + } +} + +struct C; // expected-note{{forward declaration}} + +void x3(C &c) { + switch (c) { // expected-error{{incomplete class type}} + } +} diff --git a/test/SemaCXX/typedef-redecl.cpp b/test/SemaCXX/typedef-redecl.cpp index 85944a6..e38f474 100644 --- a/test/SemaCXX/typedef-redecl.cpp +++ b/test/SemaCXX/typedef-redecl.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify -fms-extensions=0 %s +// RUN: clang-cc -fsyntax-only -verify %s typedef int INT; typedef INT REALLY_INT; // expected-note {{previous definition is here}} typedef REALLY_INT REALLY_REALLY_INT; diff --git a/test/SemaCXX/using-directive.cpp b/test/SemaCXX/using-directive.cpp index 3b67c7a..51f347d 100644 --- a/test/SemaCXX/using-directive.cpp +++ b/test/SemaCXX/using-directive.cpp @@ -102,3 +102,13 @@ namespace FuncHidesTagAmbiguity { (void)X(); // expected-error{{reference to 'X' is ambiguous}} } } + +// PR5479 +namespace Aliased { + void inAliased(); +} +namespace Alias = Aliased; +using namespace Alias; +void testAlias() { + inAliased(); +} diff --git a/test/SemaObjC/cocoa.m b/test/SemaObjC/cocoa.m index b73b3c4..7dab9f5 100644 --- a/test/SemaObjC/cocoa.m +++ b/test/SemaObjC/cocoa.m @@ -1,4 +1,4 @@ -// RUN: clang-cc -mcpu=pentium4 %s -print-stats +// RUN: clang-cc -mcpu pentium4 %s -print-stats #ifdef __APPLE__ #include <Cocoa/Cocoa.h> #endif diff --git a/test/SemaObjC/foreach.m b/test/SemaObjC/foreach.m index f136adf..2b62b17 100644 --- a/test/SemaObjC/foreach.m +++ b/test/SemaObjC/foreach.m @@ -1,4 +1,4 @@ -/* RUN: clang-cc -fsyntax-only -verify -std=c89 -pedantic %s +/* RUN: clang-cc -Wall -fsyntax-only -verify -std=c89 -pedantic %s */ @class NSArray; diff --git a/test/SemaObjC/ivar-ref-misuse.m b/test/SemaObjC/ivar-ref-misuse.m index 85ede57..707e189 100644 --- a/test/SemaObjC/ivar-ref-misuse.m +++ b/test/SemaObjC/ivar-ref-misuse.m @@ -15,7 +15,7 @@ int UseGlobalBar; @implementation Sprite + (void)setFoo:(int)foo { - sprite = foo; // expected-error {{use of undeclared identifier 'sprite'}} + sprite = foo; // expected-error {{instance variable 'sprite' accessed in class method}} spree = foo; Xsprite = foo; // expected-error {{use of undeclared identifier 'Xsprite'}} UseGlobalBar = 10; diff --git a/test/SemaTemplate/current-instantiation.cpp b/test/SemaTemplate/current-instantiation.cpp index a1d9fcb..fe2c558 100644 --- a/test/SemaTemplate/current-instantiation.cpp +++ b/test/SemaTemplate/current-instantiation.cpp @@ -142,3 +142,12 @@ struct X0<T*, U*> { void g8(typename ::X0<typename X0<T_type*, U*>::X2::my_T_type*, U_type*>::X2::my_T_type&); // expected-error{{redecl}} }; }; + +template<typename T> +struct X1 { + static int *a; + void f(float *b) { + X1<T>::a = b; // expected-error{{incompatible}} + X1<T*>::a = b; + } +}; diff --git a/test/SemaTemplate/default-arguments-cxx0x.cpp b/test/SemaTemplate/default-arguments-cxx0x.cpp new file mode 100644 index 0000000..8d8833c --- /dev/null +++ b/test/SemaTemplate/default-arguments-cxx0x.cpp @@ -0,0 +1,26 @@ +// RUN: clang-cc -fsyntax-only -std=c++0x -verify %s + +// Test default template arguments for function templates. +template<typename T = int> +void f0(); + +template<typename T> +void f0(); + +void g0() { + f0(); // okay! +} + +template<typename T, int N = T::value> +int &f1(T); + +float &f1(...); + +struct HasValue { + static const int value = 17; +}; + +void g1() { + float &fr = f1(15); + int &ir = f1(HasValue()); +} diff --git a/test/SemaTemplate/dependent-names.cpp b/test/SemaTemplate/dependent-names.cpp index 95ee2d2..aef43cb 100644 --- a/test/SemaTemplate/dependent-names.cpp +++ b/test/SemaTemplate/dependent-names.cpp @@ -14,3 +14,73 @@ int a0[sizeof(X<int>::a) == sizeof(double) ? 1 : -1]; // PR4365. template<class T> class Q; template<class T> class R : Q<T> {T current;}; + + +namespace test0 { + template <class T> class Base { + void instance_foo(); + static void static_foo(); + class Inner { + void instance_foo(); + static void static_foo(); + }; + }; + + template <class T> class Derived1 : Base<T> { + void test0() { + Base<T>::static_foo(); + Base<T>::instance_foo(); + } + + void test1() { + Base<T>::Inner::static_foo(); + Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} + } + + static void test2() { + Base<T>::static_foo(); + Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} + } + + static void test3() { + Base<T>::Inner::static_foo(); + Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} + } + }; + + template <class T> class Derived2 : Base<T>::Inner { + void test0() { + Base<T>::static_foo(); + Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} + } + + void test1() { + Base<T>::Inner::static_foo(); + Base<T>::Inner::instance_foo(); + } + + static void test2() { + Base<T>::static_foo(); + Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} + } + + static void test3() { + Base<T>::Inner::static_foo(); + Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} + } + }; + + void test0() { + Derived1<int> d1; + d1.test0(); + d1.test1(); // expected-note {{in instantiation of member function}} + d1.test2(); // expected-note {{in instantiation of member function}} + d1.test3(); // expected-note {{in instantiation of member function}} + + Derived2<int> d2; + d2.test0(); // expected-note {{in instantiation of member function}} + d2.test1(); + d2.test2(); // expected-note {{in instantiation of member function}} + d2.test3(); // expected-note {{in instantiation of member function}} + } +} diff --git a/test/SemaTemplate/dependent-sized_array.cpp b/test/SemaTemplate/dependent-sized_array.cpp new file mode 100644 index 0000000..d221a4d --- /dev/null +++ b/test/SemaTemplate/dependent-sized_array.cpp @@ -0,0 +1,17 @@ +// RUN: clang-cc -fsyntax-only -pedantic -verify %s + +template<int N> +void f() { + int a[] = { 1, 2, 3, N }; + unsigned numAs = sizeof(a) / sizeof(int); +} + +template void f<17>(); + + +template<int N> +void f1() { + int a0[] = {}; // expected-warning{{zero}} + int a1[] = { 1, 2, 3, N }; + int a3[sizeof(a1)/sizeof(int) != 4? 1 : -1]; // expected-error{{negative}} +} diff --git a/test/SemaTemplate/destructor-template.cpp b/test/SemaTemplate/destructor-template.cpp index a7c8d24..afe2cfc 100644 --- a/test/SemaTemplate/destructor-template.cpp +++ b/test/SemaTemplate/destructor-template.cpp @@ -9,4 +9,11 @@ template<typename A> class s0 { }; +struct Incomplete; +template<typename T> +void destroy_me(T me) { + me.~T(); +} + +template void destroy_me(Incomplete*); diff --git a/test/SemaTemplate/instantiate-function-1.cpp b/test/SemaTemplate/instantiate-function-1.cpp index 2749ec2..a6c269f 100644 --- a/test/SemaTemplate/instantiate-function-1.cpp +++ b/test/SemaTemplate/instantiate-function-1.cpp @@ -106,9 +106,6 @@ template<typename T> struct Do0 { void f(T t) { do { } while (t); // expected-error{{not contextually}} - - do { - } while (T t2 = T()); } }; diff --git a/test/SemaTemplate/instantiate-member-template.cpp b/test/SemaTemplate/instantiate-member-template.cpp index 95556bc..04ced92 100644 --- a/test/SemaTemplate/instantiate-member-template.cpp +++ b/test/SemaTemplate/instantiate-member-template.cpp @@ -116,3 +116,18 @@ struct X2 { X2<int&> x2a; // expected-note{{instantiation}} X2<float> x2b; // expected-note{{instantiation}} + +namespace N0 { + template<typename T> + struct X0 { }; + + struct X1 { + template<typename T> void f(X0<T>& vals) { g(vals); } + template<typename T> void g(X0<T>& vals) { } + }; + + void test(X1 x1, X0<int> x0i, X0<long> x0l) { + x1.f(x0i); + x1.f(x0l); + } +} diff --git a/test/SemaTemplate/instantiate-method.cpp b/test/SemaTemplate/instantiate-method.cpp index df1e1d9..2351d88 100644 --- a/test/SemaTemplate/instantiate-method.cpp +++ b/test/SemaTemplate/instantiate-method.cpp @@ -84,6 +84,8 @@ int *a(A0<int> &x0, A1<int> &x1) { struct X0Base { int &f(); + int& g(int); + static double &g(double); }; template<typename T> @@ -92,9 +94,28 @@ struct X0 : X0Base { template<typename U> struct X1 : X0<U> { - int &f2() { return X0Base::f(); } + int &f2() { + // FIXME: We should be able to do this lookup and diagnose the error + // *despite* the fact that we can't decide the relationship yet. + return X0Base::f(); // expected-FIXME-error{{call to non-static member function without an object argument}} + } }; void test_X1(X1<int> x1i) { int &ir = x1i.f2(); } + +template<typename U> +struct X2 : X0Base, U { + int &f2() { return X0Base::f(); } +}; + +template<typename T> +struct X3 { + void test(T x) { + double& d1 = X0Base::g(x); + } +}; + + +template struct X3<double>; diff --git a/test/SemaTemplate/instantiate-static-var.cpp b/test/SemaTemplate/instantiate-static-var.cpp index 96fa34c..452fccf 100644 --- a/test/SemaTemplate/instantiate-static-var.cpp +++ b/test/SemaTemplate/instantiate-static-var.cpp @@ -1,5 +1,4 @@ // RUN: clang-cc -fsyntax-only -verify %s - template<typename T, T Divisor> class X { public: @@ -38,3 +37,38 @@ void test() { DefCon &DC = Z<DefCon>::value; NoDefCon &NDC = Z<NoDefCon>::value; // expected-note{{instantiation}} } + +// PR5609 +struct X1 { + ~X1(); // The errors won't be triggered without this dtor. +}; + +template <typename T> +struct Y1 { + static char Helper(T); + static const int value = sizeof(Helper(T())); +}; + +struct X2 { + virtual ~X2(); +}; + +namespace std { + class type_info { }; +} + +template <typename T> +struct Y2 { + static T &Helper(); + static const int value = sizeof(typeid(Helper())); +}; + +template <int> +struct Z1 {}; + +void Test() { + Z1<Y1<X1>::value> x; + int y[Y1<X1>::value]; + Z1<Y2<X2>::value> x2; + int y2[Y2<X2>::value]; +} diff --git a/test/SemaTemplate/instantiation-depth.cpp b/test/SemaTemplate/instantiation-depth.cpp index 522c4e1..31abb40 100644 --- a/test/SemaTemplate/instantiation-depth.cpp +++ b/test/SemaTemplate/instantiation-depth.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -ftemplate-depth=5 -verify %s +// RUN: clang-cc -fsyntax-only -ftemplate-depth 5 -verify %s template<typename T> struct X : X<T*> { }; // expected-error{{recursive template instantiation exceeded maximum depth of 5}} \ // expected-note{{use -ftemplate-depth-N to increase recursive template instantiation depth}} \ diff --git a/test/SemaTemplate/nested-name-spec-template.cpp b/test/SemaTemplate/nested-name-spec-template.cpp index e936640..436732a 100644 --- a/test/SemaTemplate/nested-name-spec-template.cpp +++ b/test/SemaTemplate/nested-name-spec-template.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify -fms-extensions=0 %s +// RUN: clang-cc -fsyntax-only -verify %s namespace N { namespace M { diff --git a/test/SemaTemplate/overload-uneval.cpp b/test/SemaTemplate/overload-uneval.cpp new file mode 100644 index 0000000..2e3bfed --- /dev/null +++ b/test/SemaTemplate/overload-uneval.cpp @@ -0,0 +1,42 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +// Tests that overload resolution is treated as an unevaluated context. +// PR5541 +struct Foo +{ + Foo *next; +}; + +template <typename> +struct Bar +{ +}; + + +template <typename T> +class Wibble +{ + typedef Bar<T> B; + + static inline B *concrete(Foo *node) { + int a[sizeof(T) ? -1 : -1]; + return reinterpret_cast<B *>(node); + } + +public: + class It + { + Foo *i; + + public: + inline operator B *() const { return concrete(i); } + inline bool operator!=(const It &o) const { return i != +o.i; } + }; +}; + +void f() { + Wibble<void*>::It a, b; + + a != b; +} diff --git a/test/SemaTemplate/qualified-id.cpp b/test/SemaTemplate/qualified-id.cpp index 85efab2..a07f05c 100644 --- a/test/SemaTemplate/qualified-id.cpp +++ b/test/SemaTemplate/qualified-id.cpp @@ -7,3 +7,14 @@ namespace a { namespace b { template<typename T> void f0(a::C<T> &a0) { } } + + +namespace test1 { + int a = 0; + template <class T> class Base { }; + template <class T> class Derived : public Base<T> { + int foo() { + return test1::a; + } + }; +} diff --git a/test/SemaTemplate/temp_arg_nontype.cpp b/test/SemaTemplate/temp_arg_nontype.cpp index bde92be..0c44651 100644 --- a/test/SemaTemplate/temp_arg_nontype.cpp +++ b/test/SemaTemplate/temp_arg_nontype.cpp @@ -151,3 +151,12 @@ namespace ns { Baz<static_cast<ns::E>(0)> b2; // This neither. } +// PR5597 +template<int (*)(float)> struct X0 { }; + +struct X1 { + static int pfunc(float); +}; +void test_X0_X1() { + X0<X1::pfunc> x01; +} diff --git a/test/SemaTemplate/temp_explicit.cpp b/test/SemaTemplate/temp_explicit.cpp index 9c824d6..ae409af 100644 --- a/test/SemaTemplate/temp_explicit.cpp +++ b/test/SemaTemplate/temp_explicit.cpp @@ -108,3 +108,20 @@ struct X6 { }; template struct X6::Inner; // expected-error{{non-templated}} + +// PR5559 +template <typename T> +struct Foo; + +template <> +struct Foo<int> // expected-note{{header not required for explicitly-specialized}} +{ + template <typename U> + struct Bar + {}; +}; + +template <> // expected-warning{{extraneous template parameter list}} +template <> +struct Foo<int>::Bar<void> +{}; |