diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-01-16 19:38:23 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-01-16 19:38:23 +0000 |
commit | 225b321a85984967fcfbf0726dcf7e8b2546d690 (patch) | |
tree | 8315d79f8c572847523064d8ffd728efa2c429fd /clang | |
parent | 972347d4f1cc3cfca94aba55978902c4f8a6e6d4 (diff) | |
download | bcm5719-llvm-225b321a85984967fcfbf0726dcf7e8b2546d690.tar.gz bcm5719-llvm-225b321a85984967fcfbf0726dcf7e8b2546d690.zip |
Fix <rdar://problem/6502934>. We were creating an ImplicitCastExpr
with reference type (it should be an lvalue with non-reference type).
llvm-svn: 62345
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/AST/Decl.h | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 6 | ||||
-rw-r--r-- | clang/test/SemaCXX/enum.cpp | 13 | ||||
-rw-r--r-- | clang/test/SemaCXX/member-name-lookup.cpp | 4 |
4 files changed, 20 insertions, 6 deletions
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index 9ca1d3e9c9e..f8e50925360 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -1076,7 +1076,8 @@ class RecordDecl : public TagDecl { /// If so, this cannot be contained in arrays or other structs as a member. bool HasFlexibleArrayMember : 1; - /// + /// AnonymousStructOrUnion - Whether this is the type of an + /// anonymous struct or union. bool AnonymousStructOrUnion : 1; protected: diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 73ac18eb1aa..ba502ec7baa 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -764,7 +764,8 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType, if (SCS.CopyConstructor) { // FIXME: Create a temporary object by calling the copy // constructor. - ImpCastExprToType(From, ToType); + ImpCastExprToType(From, ToType.getNonReferenceType(), + ToType->isReferenceType()); return false; } @@ -849,7 +850,8 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType, break; case ICK_Qualification: - ImpCastExprToType(From, ToType); + ImpCastExprToType(From, ToType.getNonReferenceType(), + ToType->isReferenceType()); break; default: diff --git a/clang/test/SemaCXX/enum.cpp b/clang/test/SemaCXX/enum.cpp index 7c44056e497..7626e4ab695 100644 --- a/clang/test/SemaCXX/enum.cpp +++ b/clang/test/SemaCXX/enum.cpp @@ -1,5 +1,4 @@ // RUN: clang -fsyntax-only -verify %s - enum E { Val1, Val2 @@ -12,3 +11,15 @@ void f() { E e = Val1; float& fr = enumerator_type(Val2); } + +// <rdar://problem/6502934> +typedef enum Foo { + A = 0, + B = 1 +} Foo; + + +void bar() { + Foo myvar = A; + myvar = B; +} diff --git a/clang/test/SemaCXX/member-name-lookup.cpp b/clang/test/SemaCXX/member-name-lookup.cpp index 1eb83548c19..4752f57acac 100644 --- a/clang/test/SemaCXX/member-name-lookup.cpp +++ b/clang/test/SemaCXX/member-name-lookup.cpp @@ -59,10 +59,10 @@ void D::test_lookup() { f(0); // expected-error{{non-static member 'f' found in multiple base-class subobjects of type 'struct A'}} static_f(0); // okay - // FIXME: should work E e = D::enumerator; // okay + E e = enumerator; // okay type t = 0; // okay - // FIXME: E2 e2 = D::enumerator2; // okay + E2 e2 = enumerator2; // okay E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}} } |