hanchenye-llvm-project/clang/test/Sema/scope-check.c

45 lines
641 B
C
Raw Normal View History

// RUN: clang-cc -fsyntax-only -verify %s
Start of checking for gotos which jump to an illegal destination. As far as I know, this catches all cases of jumping into the scope of a variable with a variably modified type (excluding statement expressions) in C. This is missing some stuff we probably want to check (other kinds of variably modified declarations, statement expressions, indirect gotos/addresses of labels in a scope, ObjC @try/@finally, cleanup attribute), the diagnostics aren't very good, and it's not particularly efficient, but it's a decent start. This patch is a slightly modified version of the patch I attached to PR3259, and it fixes that bug. I was sort of planning on improving it, but I think it's okay as-is, especially since it looks like CodeGen doesn't have any use for this sort of data structure. The only significant change I can think of from the version I attached to PR3259 is that this version skips running the checking code when a function doesn't contain any labels. This patch doesn't cover case statements, which also need similar checking; I'm not sure how we should deal with that. Extending the goto checking to also check case statements wouldn't be too hard; it's just a matter of keeping track of the scope of the closest switch and checking that the scope of every case is the same as the scope of the switch. That said, it would likely be a performance hit to run this check on every function (it's an extra pass over the entire function), so we probably want some other solution. llvm-svn: 65678
2009-02-28 13:41:13 +08:00
int test1(int x) {
goto L; // expected-error{{illegal jump}}
int a[x];
L:
return sizeof a;
}
int test2(int x) {
goto L; // expected-error{{illegal jump}}
typedef int a[x];
L:
return sizeof(a);
}
void test3clean(int*);
int test3() {
goto L; // expected-error{{illegal jump}}
2009-04-18 15:54:11 +08:00
int a __attribute((cleanup(test3clean)));
L:
return a;
}
int test4(int x) {
2009-04-18 15:54:11 +08:00
goto L; // expected-error{{illegal jump}}
int a[x];
test4(x);
L:
return sizeof a;
}
2009-04-18 15:54:11 +08:00
int test5(int x) {
int a[x];
test5(x);
goto L; // Ok.
L:
goto L; // Ok.
return sizeof a;
}
// FIXME: Switch cases etc.