2009-03-24 05:24:46 +03:00
|
|
|
// RUN: clang-cc -fsyntax-only -verify %s
|
2009-03-19 03:39:20 +03:00
|
|
|
|
|
|
|
namespace std {
|
|
|
|
template<typename T> class vector { };
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef int INT;
|
|
|
|
typedef float Real;
|
|
|
|
|
|
|
|
void test() {
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
std::vector<INT> v1;
|
|
|
|
vector<Real> v2;
|
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<char>" down to their underlying "class
basic_string<char, char_traits<char>, allocator<char>>, 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
2009-04-01 19:47:24 +04:00
|
|
|
v1 = v2; // expected-error{{incompatible type assigning 'vector<Real>', expected 'std::vector<INT>'}}
|
2009-03-19 03:39:20 +03:00
|
|
|
}
|