diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-02-21 18:36:56 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-02-21 18:36:56 +0000 |
| commit | 90d554ecb30d5282aff54aca2f9b0f3751e83c8c (patch) | |
| tree | 5a7fde105ec946945bbd76347cc49828f8340300 /clang/test | |
| parent | 901e717f9295e5d9616777ad2a0c89c86ef5268d (diff) | |
| download | bcm5719-llvm-90d554ecb30d5282aff54aca2f9b0f3751e83c8c.tar.gz bcm5719-llvm-90d554ecb30d5282aff54aca2f9b0f3751e83c8c.zip | |
Implement support for parsing pseudo-destructor expression with a nested-name-specifier, e.g.,
typedef int Int;
int *p;
p->Int::~Int();
This weakens the invariant that the only types in nested-name-specifiers are tag types (restricted to class types in C++98/03). However, we weaken this invariant as little as possible, accepting arbitrary types in nested-name-specifiers only when we're in a member access expression that looks like a pseudo-destructor expression.
llvm-svn: 96743
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/SemaCXX/pseudo-destructors.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/pseudo-destructors.cpp b/clang/test/SemaCXX/pseudo-destructors.cpp index 02e2c14ca11..2cc233318ec 100644 --- a/clang/test/SemaCXX/pseudo-destructors.cpp +++ b/clang/test/SemaCXX/pseudo-destructors.cpp @@ -5,6 +5,7 @@ enum Foo { F }; typedef Foo Bar; typedef int Integer; +typedef double Double; void g(); @@ -12,7 +13,7 @@ namespace N { typedef Foo Wibble; } -void f(A* a, Foo *f, int *i) { +void f(A* a, Foo *f, int *i, double *d) { a->~A(); a->A::~A(); @@ -31,6 +32,11 @@ void f(A* a, Foo *f, int *i) { f->N::~Wibble(); // FIXME: Cannot use typedef name in destructor id. f->::~Bar(17, 42); // expected-error{{cannot have any arguments}} + + i->~Integer(); + i->Integer::~Integer(); + + i->Integer::~Double(); // expected-error{{the type of object expression ('int') does not match the type being destroyed ('double') in pseudo-destructor expression}} } typedef int Integer; |

