From: Chris Lattner
Date: Wed, 30 Sep 2009 20:19:10 +0000 (+0000)
Subject: add some more popular examples, color code warning: and error: like the command line.
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e3b44b0f4e738b62c8302084363334bfadd7963;p=clang
add some more popular examples, color code warning: and error: like the command line.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83161 91177308-0d34-0410-b5e6-96231b3b80d8
---
diff --git a/www/diagnostics.html b/www/diagnostics.html
index 5be4db2074..d1645b6ca7 100644
--- a/www/diagnostics.html
+++ b/www/diagnostics.html
@@ -43,7 +43,7 @@ what is wrong in a particular piece of code, an example is:
$ gcc-4.2 -fsyntax-only -Wformat format-strings.c
format-strings.c:91: warning: too few arguments for format
$ clang -fsyntax-only format-strings.c
- format-strings.c:91:13: warning: '.*' specified field precision is missing a matching 'int' argument
+ format-strings.c:91:13: warning: '.*' specified field precision is missing a matching 'int' argument
printf("%.*d");
^
@@ -64,7 +64,7 @@ nonsensical example to illustrate this:
$ gcc-4.2 -fsyntax-only t.c
t.c:7: error: invalid operands to binary + (have 'int' and 'struct A')
$ clang -fsyntax-only t.c
- t.c:7:39: error: invalid operands to binary expression ('int' and 'struct A')
+ t.c:7:39: error: invalid operands to binary expression ('int' and 'struct A')
return y + func(y ? ((SomeA.X + 40) + SomeA) / 42 + SomeA.X : SomeA.X);
~~~~~~~~~~~~~~ ^ ~~~~~
@@ -89,7 +89,7 @@ one:
$ gcc-4.2 -fsyntax-only t.c
t.c:5: error: invalid type argument of 'unary *'
$ clang -fsyntax-only t.c
- t.c:5:11: error: indirection requires pointer operand ('int' invalid)
+ t.c:5:11: error: indirection requires pointer operand ('int' invalid)
int y = *SomeA.X;
^~~~~~~~
@@ -112,7 +112,7 @@ example P and Q have type "int*":
$ gcc-4.2 -fsyntax-only t.c
#'exact_div_expr' not supported by pp_c_expression#'t.c:12: error: called object is not a function
$ clang -fsyntax-only t.c
- t.c:12:8: error: called object type 'int' is not a function or function pointer
+ t.c:12:8: error: called object type 'int' is not a function or function pointer
(P-Q)();
~~~~~^
@@ -134,7 +134,7 @@ a typedef in C:
$ gcc-4.2 -fsyntax-only t.c
t.c:15: error: invalid operands to binary / (have 'float __vector__' and 'const int *')
$ clang -fsyntax-only t.c
- t.c:15:11: error: can't convert between vector values of different size ('__m128' and 'int const *')
+ t.c:15:11: error: can't convert between vector values of different size ('__m128' and 'int const *')
myvec[1]/P;
~~~~~~~~^~
@@ -148,7 +148,7 @@ is useful for the compiler to expose underlying details of a typedef:
$ gcc-4.2 -fsyntax-only t.c
t.c:13: error: request for member 'x' in something not a structure or union
$ clang -fsyntax-only t.c
- t.c:13:9: error: member reference base type 'pid_t' (aka 'int') is not a structure or union
+ t.c:13:9: error: member reference base type 'pid_t' (aka 'int') is not a structure or union
myvar = myvar.x;
~~~~~ ^
@@ -182,7 +182,7 @@ void addHTTPService(servers::Server const &server, ::services::WebService const
$ g++-4.2 -fsyntax-only t.cpp
t.cpp:9: error: no match for 'operator+=' in 'server += http'
$ clang -fsyntax-only t.cpp
- t.cpp:9:10: error: invalid operands to binary expression ('servers::Server const' and '::services::WebService const *')
+ t.cpp:9:10: error: invalid operands to binary expression ('servers::Server const' and '::services::WebService const *')
server += http;
~~~~~~ ^ ~~~~
@@ -193,7 +193,7 @@ void addHTTPService(servers::Server const &server, ::services::WebService const
$ g++-4.2 -fsyntax-only t.cpp
t.cpp:12: error: no match for 'operator=' in 'str = vec'
$ clang -fsyntax-only t.cpp
- t.cpp:12:7: error: incompatible type assigning 'vector<Real>', expected 'std::string' (aka 'class std::basic_string<char>')
+ t.cpp:12:7: error: incompatible type assigning 'vector<Real>', expected 'std::string' (aka 'class std::basic_string<char>')
str = vec;
^ ~~~
@@ -210,21 +210,25 @@ extension that has been considered obsolete since 1993:
$ clang t.c
- t.c:5:28: warning: use of GNU old-style field designator extension
+ t.c:5:28: warning: use of GNU old-style field designator extension
struct point origin = { x: 0.0, y: 0.0 };
~~ ^
.x =
- t.c:5:36: warning: use of GNU old-style field designator extension
+ t.c:5:36: warning: use of GNU old-style field designator extension
struct point origin = { x: 0.0, y: 0.0 };
~~ ^
.y =
-The underlined code should be removed, then replaced with the code below the caret line (".x =" or ".y =", respectively). "Fix-it" hints are most useful for working around common user errors and misconceptions. For example, C++ users commonly forget the syntax for explicit specialization of class templates, as in the following error:
+The underlined code should be removed, then replaced with the code below the
+caret line (".x =" or ".y =", respectively). "Fix-it" hints are most useful for
+working around common user errors and misconceptions. For example, C++ users
+commonly forget the syntax for explicit specialization of class templates,
+as in the following error:
$ clang t.cpp
- t.cpp:9:3: error: template specialization requires 'template<>'
+ t.cpp:9:3: error: template specialization requires 'template<>'
struct iterator_traits<file_iterator> {
^
template<>
@@ -244,7 +248,7 @@ Clang helps you out:
t.c: In function 'test':
t.c:80: error: invalid operands to binary < (have 'struct mystruct' and 'float')
$ clang -fsyntax-only t.c
- t.c:80:3: error: invalid operands to binary expression ('typeof(P)' (aka 'struct mystruct') and 'typeof(F)' (aka 'float'))
+ t.c:80:3: error: invalid operands to binary expression ('typeof(P)' (aka 'struct mystruct') and 'typeof(F)' (aka 'float'))
X = MYMAX(P, F);
^~~~~~~~~~~
t.c:76:94: note: instantiated from:
@@ -260,7 +264,7 @@ implements the "wwopen" class of APIs):
$ clang -fsyntax-only t.c
- t.c:22:2: warning: type specifier missing, defaults to 'int'
+ t.c:22:2: warning: type specifier missing, defaults to 'int'
ILPAD();
^
t.c:17:17: note: instantiated from:
@@ -274,6 +278,45 @@ implements the "wwopen" class of APIs):
In practice, we've found that this is actually more useful in multiply nested
macros that in simple ones.
+Quality of Implementation and Attention to Detail
+
+Finally, we have put a lot of work polishing the little things, because
+little things add up over time and contribute to a great user experience. Two
+examples are:
+
+
+ $ gcc-4.2 t.c
+ t.c: In function 'foo':
+ t.c:5: error: expected ';' before '}' token
+ $ clang t.c
+ t.c:4:8: error: expected ';' after expression
+ bar()
+ ^
+ ;
+
+
+This shows a trivial little tweak, where we tell you to put the semicolon at
+the end of the line that is missing it (line 8) instead of at the beginning of
+the following line (line 9). This is particularly important with fixit hints
+and caret diagnostics, because otherwise you don't get the important context.
+
+
+
+ $ gcc-4.2 t.c
+ t.c:3: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
+ $ clang t.c
+ t.c:3:1: error: unknown type name 'foo_t'
+ foo_t *P = 0;
+ ^
+
+
+This shows an example of much better error recovery. The message coming out
+of GCC is completely useless for diagnosing the problem, Clang tries much harder
+and produces a much more useful diagnosis of the problem.
+
+While each of these details is minor, we feel that they all add up to provide
+a much more polished experience.
+