summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-01-16 19:38:23 +0000
committerDouglas Gregor <dgregor@apple.com>2009-01-16 19:38:23 +0000
commit225b321a85984967fcfbf0726dcf7e8b2546d690 (patch)
tree8315d79f8c572847523064d8ffd728efa2c429fd /clang
parent972347d4f1cc3cfca94aba55978902c4f8a6e6d4 (diff)
downloadbcm5719-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.h3
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp6
-rw-r--r--clang/test/SemaCXX/enum.cpp13
-rw-r--r--clang/test/SemaCXX/member-name-lookup.cpp4
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}}
}
OpenPOWER on IntegriCloud