summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-11-02 21:05:53 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-11-02 21:05:53 +0000
commitdba351df64e1a3b03506ae611e0a009baed0b8df (patch)
tree86513dcdc5db41e99ac5eda620a98bd6b1440e59 /clang
parent8e7cb6dcfa1b6fe62097b5abd25611c99bdbcd6e (diff)
downloadbcm5719-llvm-dba351df64e1a3b03506ae611e0a009baed0b8df.tar.gz
bcm5719-llvm-dba351df64e1a3b03506ae611e0a009baed0b8df.zip
Fixes an assertion violation when bind to temporary
expression is a dependent expression. // rdar: // 8620524 and PR7851 llvm-svn: 118066
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/ExprCXX.h5
-rw-r--r--clang/lib/AST/ExprCXX.cpp4
-rw-r--r--clang/test/CodeGenCXX/template-dependent-bind-temporary.cpp24
3 files changed, 30 insertions, 3 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index a0a059ef95b..3b8ecf29307 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -672,8 +672,9 @@ class CXXBindTemporaryExpr : public Expr {
Stmt *SubExpr;
- CXXBindTemporaryExpr(CXXTemporary *temp, Expr* subexpr)
- : Expr(CXXBindTemporaryExprClass, subexpr->getType(), false, false),
+ CXXBindTemporaryExpr(CXXTemporary *temp, Expr* subexpr,
+ bool TD=false, bool VD=false)
+ : Expr(CXXBindTemporaryExprClass, subexpr->getType(), TD, VD),
Temp(temp), SubExpr(subexpr) { }
public:
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp
index 05b6fc1f6c4..a07d7840f0c 100644
--- a/clang/lib/AST/ExprCXX.cpp
+++ b/clang/lib/AST/ExprCXX.cpp
@@ -534,7 +534,9 @@ CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
assert(SubExpr->getType()->isRecordType() &&
"Expression bound to a temporary must have record type!");
- return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
+ return new (C) CXXBindTemporaryExpr(Temp, SubExpr,
+ SubExpr->isTypeDependent(),
+ SubExpr->isValueDependent());
}
CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
diff --git a/clang/test/CodeGenCXX/template-dependent-bind-temporary.cpp b/clang/test/CodeGenCXX/template-dependent-bind-temporary.cpp
new file mode 100644
index 00000000000..cc1ce866fe2
--- /dev/null
+++ b/clang/test/CodeGenCXX/template-dependent-bind-temporary.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
+// rdar: //8620524
+// PR7851
+struct string {
+ string (const string& );
+ string ();
+ ~string();
+};
+
+string operator + (char ch, const string&);
+
+template <class T>
+void IntToString(T a)
+{
+ string result;
+ T digit;
+ char((digit < 10 ? '0' : 'a') + digit) + result;
+}
+
+int main() {
+// CHECK: define linkonce_odr void @_Z11IntToStringIcEvT_(
+ IntToString('a');
+}
+
OpenPOWER on IntegriCloud