From 225b321a85984967fcfbf0726dcf7e8b2546d690 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 16 Jan 2009 19:38:23 +0000 Subject: Fix . We were creating an ImplicitCastExpr with reference type (it should be an lvalue with non-reference type). llvm-svn: 62345 --- clang/include/clang/AST/Decl.h | 3 ++- clang/lib/Sema/SemaExprCXX.cpp | 6 ++++-- clang/test/SemaCXX/enum.cpp | 13 ++++++++++++- clang/test/SemaCXX/member-name-lookup.cpp | 4 ++-- 4 files changed, 20 insertions(+), 6 deletions(-) (limited to 'clang') 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); } + +// +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}} } -- cgit v1.2.3