diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-04-24 05:37:28 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-04-24 05:37:28 +0000 |
commit | 0e7dde535d5312a67038bff3d1ed31f085f31e02 (patch) | |
tree | 9bdfbaefa433f093b88c95ac03ca1fdd4ac6ca0c /clang/test/FixIt/typo.c | |
parent | d8d1e2ae665ccbd205df9cc16933227541e4e3b7 (diff) | |
download | bcm5719-llvm-0e7dde535d5312a67038bff3d1ed31f085f31e02.tar.gz bcm5719-llvm-0e7dde535d5312a67038bff3d1ed31f085f31e02.zip |
Implement a new identifier-classification scheme where Sema
performs name lookup for an identifier and resolves it to a
type/expression/template/etc. in the same step. This scheme is
intended to improve both performance (by reducing the number of
redundant name lookups for a given identifier token) and error
recovery (by giving Sema a chance to correct type names before the
parser has decided that the identifier isn't a type name). For
example, this allows us to properly typo-correct type names at the
beginning of a statement:
t.c:6:3: error: use of undeclared identifier 'integer'; did you mean
'Integer'?
integer *i = 0;
^~~~~~~
Integer
t.c:1:13: note: 'Integer' declared here
typedef int Integer;
^
Previously, we wouldn't give a Fix-It because the typo correction
occurred after the parser had checked whether "integer" was a type
name (via Sema::getTypeName(), which isn't allowed to typo-correct)
and therefore decided to parse "integer * i = 0" as an expression. By
typo-correcting earlier, we typo-correct to the type name Integer and
parse this as a declaration.
Moreover, in this context, we can also typo-correct identifiers to
keywords, e.g.,
t.c:7:3: error: use of undeclared identifier 'vid'; did you mean
'void'?
vid *p = i;
^~~
void
and recover appropriately.
Note that this is very much a work-in-progress. The new
Sema::ClassifyName is only used for expression-or-declaration
disambiguation in C at the statement level. The next steps will be to
make this work for the same disambiguation in C++ (where
functional-style casts make some trouble), then push it
further into the parser to eliminate more redundant name lookups.
Fixes <rdar://problem/7963833> for C and starts us down the path of
<rdar://problem/8172000>.
llvm-svn: 130082
Diffstat (limited to 'clang/test/FixIt/typo.c')
-rw-r--r-- | clang/test/FixIt/typo.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/test/FixIt/typo.c b/clang/test/FixIt/typo.c index 01ff3a09cf3..8a277c75f03 100644 --- a/clang/test/FixIt/typo.c +++ b/clang/test/FixIt/typo.c @@ -2,6 +2,7 @@ // RUN: cp %s %t // RUN: %clang_cc1 -fsyntax-only -fixit -x c %t || true // RUN: %clang_cc1 -fsyntax-only -pedantic -Werror -x c %t +// RUN: grep "Rectangle" %t struct Point { float x, y; }; @@ -23,3 +24,14 @@ struct Window window = { topleft.x = 3.14, // expected-error{{field designator 'topleft' does not refer to any field in type 'struct Rectangle'; did you mean 'top_left'?}} 2.71818, 5.0, 6.0, Red }; + +void test() { + Rectangle r1; // expected-error{{must use 'struct' tag to refer to type 'Rectangle'}} + r1.top_left.x = 0; + + typedef struct Rectangle Rectangle; // expected-note{{'Rectangle' declared here}} + rectangle *r2 = &r1; // expected-error{{use of undeclared identifier 'rectangle'; did you mean 'Rectangle'?}} + r2->top_left.y = 0; + unsinged *ptr = 0; // expected-error{{use of undeclared identifier 'unsinged'; did you mean 'unsigned'?}} + *ptr = 17; +} |