From 969c689d893a248eca4f049f5b89f747e66e4bff Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 1 Apr 2009 15:47:24 +0000 Subject: Give Type::getDesugaredType a "for-display" mode that can apply more heuristics to determine when it's useful to desugar a type for display to the user. Introduce two C++-specific heuristics: - For a qualified type (like "foo::bar"), only produce a new desugred type if desugaring the qualified type ("bar", in this case) produces something interesting. For example, if "foo::bar" refers to a class named "bar", don't desugar. However, if "foo::bar" refers to a typedef of something else, desugar to that something else. This gives some useful desugaring such as "foo::bar (aka 'int')". - Don't desugar class template specialization types like "basic_string" down to their underlying "class basic_string, allocator>, etc."; it's better just to leave such types alone. Update diagnostics.html with some discussion and examples of type preservation in C++, showing qualified names and class template specialization types. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68207 91177308-0d34-0410-b5e6-96231b3b80d8 --- www/diagnostics.html | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) (limited to 'www/diagnostics.html') diff --git a/www/diagnostics.html b/www/diagnostics.html index 38c87728ae..4f68f58d52 100644 --- a/www/diagnostics.html +++ b/www/diagnostics.html @@ -156,6 +156,48 @@ is useful for the compiler to expose underlying details of a typedef:

If the user was somehow confused about how the system "pid_t" typedef is defined, Clang helpfully displays it with "aka".

+

In C++, type preservation includes retaining any qualification written into type names. For example, if we take a small snippet of code such as: + +

+
+namespace services {
+  struct WebService {  };
+}
+namespace myapp {
+  namespace servers {
+    struct Server {  };
+  }
+}
+
+using namespace myapp;
+void addHTTPService(servers::Server const &server, ::services::WebService const *http) {
+  server += http;
+}
+
+
+ +

and then compile it, we see that Clang is both providing more accurate information and is retaining the types as written by the user (e.g., "servers::Server", "::services::WebService"): + +

+  $ 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 *')
+    server += http;
+    ~~~~~~ ^  ~~~~
+
+ +

Naturally, type preservation extends to uses of templates, and Clang retains information about how a particular template specialization (like std::vector<Real>) was spelled within the source code. For example:

+ +
+  $ 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>')
+    str = vec;
+        ^ ~~~
+
+

Fix-it Hints

simple example + template<> example

@@ -203,11 +245,6 @@ 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.

-

C++ Fun Examples

- -

...

- - -- cgit v1.2.1