aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Frontend/PCHReaderStmt.cpp4
-rw-r--r--lib/Frontend/PCHWriterStmt.cpp4
-rw-r--r--lib/Sema/Sema.h4
-rw-r--r--lib/Sema/SemaExpr.cpp18
-rw-r--r--lib/Sema/TreeTransform.h26
5 files changed, 36 insertions, 20 deletions
diff --git a/lib/Frontend/PCHReaderStmt.cpp b/lib/Frontend/PCHReaderStmt.cpp
index d5d527d32e..938ff9a48a 100644
--- a/lib/Frontend/PCHReaderStmt.cpp
+++ b/lib/Frontend/PCHReaderStmt.cpp
@@ -730,8 +730,8 @@ void PCHStmtReader::VisitStmtExpr(StmtExpr *E) {
void PCHStmtReader::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
VisitExpr(E);
- E->setArgType1(Reader.GetType(Record[Idx++]));
- E->setArgType2(Reader.GetType(Record[Idx++]));
+ E->setArgTInfo1(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
+ E->setArgTInfo2(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
}
diff --git a/lib/Frontend/PCHWriterStmt.cpp b/lib/Frontend/PCHWriterStmt.cpp
index 3a65785b0f..2c4452c888 100644
--- a/lib/Frontend/PCHWriterStmt.cpp
+++ b/lib/Frontend/PCHWriterStmt.cpp
@@ -718,8 +718,8 @@ void PCHStmtWriter::VisitStmtExpr(StmtExpr *E) {
void PCHStmtWriter::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
VisitExpr(E);
- Writer.AddTypeRef(E->getArgType1(), Record);
- Writer.AddTypeRef(E->getArgType2(), Record);
+ Writer.AddTypeSourceInfo(E->getArgTInfo1(), Record);
+ Writer.AddTypeSourceInfo(E->getArgTInfo2(), Record);
Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
Writer.AddSourceLocation(E->getRParenLoc(), Record);
Code = pch::EXPR_TYPES_COMPATIBLE;
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 1e5da3d339..74d0f2afad 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -2154,6 +2154,10 @@ public:
virtual OwningExprResult ActOnTypesCompatibleExpr(SourceLocation BuiltinLoc,
TypeTy *arg1, TypeTy *arg2,
SourceLocation RPLoc);
+ OwningExprResult BuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
+ TypeSourceInfo *argTInfo1,
+ TypeSourceInfo *argTInfo2,
+ SourceLocation RPLoc);
// __builtin_choose_expr(constExpr, expr1, expr2)
virtual OwningExprResult ActOnChooseExpr(SourceLocation BuiltinLoc,
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index d573ca9bbb..e5a5065687 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -7019,12 +7019,21 @@ Sema::OwningExprResult Sema::ActOnBuiltinOffsetOf(Scope *S,
Sema::OwningExprResult Sema::ActOnTypesCompatibleExpr(SourceLocation BuiltinLoc,
TypeTy *arg1,TypeTy *arg2,
SourceLocation RPLoc) {
- // FIXME: Preserve type source info.
- QualType argT1 = GetTypeFromParser(arg1);
- QualType argT2 = GetTypeFromParser(arg2);
+ TypeSourceInfo *argTInfo1;
+ QualType argT1 = GetTypeFromParser(arg1, &argTInfo1);
+ TypeSourceInfo *argTInfo2;
+ QualType argT2 = GetTypeFromParser(arg2, &argTInfo2);
assert((!argT1.isNull() && !argT2.isNull()) && "Missing type argument(s)");
+ return BuildTypesCompatibleExpr(BuiltinLoc, argTInfo1, argTInfo2, RPLoc);
+}
+
+Sema::OwningExprResult
+Sema::BuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
+ TypeSourceInfo *argTInfo1,
+ TypeSourceInfo *argTInfo2,
+ SourceLocation RPLoc) {
if (getLangOptions().CPlusPlus) {
Diag(BuiltinLoc, diag::err_types_compatible_p_in_cplusplus)
<< SourceRange(BuiltinLoc, RPLoc);
@@ -7032,9 +7041,10 @@ Sema::OwningExprResult Sema::ActOnTypesCompatibleExpr(SourceLocation BuiltinLoc,
}
return Owned(new (Context) TypesCompatibleExpr(Context.IntTy, BuiltinLoc,
- argT1, argT2, RPLoc));
+ argTInfo1, argTInfo2, RPLoc));
}
+
Sema::OwningExprResult Sema::ActOnChooseExpr(SourceLocation BuiltinLoc,
ExprArg cond,
ExprArg expr1, ExprArg expr2,
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index d13219dbcf..65107ccfe7 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -1354,11 +1354,11 @@ public:
/// By default, performs semantic analysis to build the new expression.
/// Subclasses may override this routine to provide different behavior.
OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
- QualType T1, QualType T2,
+ TypeSourceInfo *TInfo1,
+ TypeSourceInfo *TInfo2,
SourceLocation RParenLoc) {
- return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
- T1.getAsOpaquePtr(),
- T2.getAsOpaquePtr(),
+ return getSema().BuildTypesCompatibleExpr(BuiltinLoc,
+ TInfo1, TInfo2,
RParenLoc);
}
@@ -4855,27 +4855,29 @@ TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
template<typename Derived>
Sema::OwningExprResult
TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
- QualType T1, T2;
+ TypeSourceInfo *TInfo1;
+ TypeSourceInfo *TInfo2;
{
// FIXME: Source location isn't quite accurate.
TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
- T1 = getDerived().TransformType(E->getArgType1());
- if (T1.isNull())
+ TInfo1 = getDerived().TransformType(E->getArgTInfo1());
+ if (!TInfo1)
return SemaRef.ExprError();
- T2 = getDerived().TransformType(E->getArgType2());
- if (T2.isNull())
+ TInfo2 = getDerived().TransformType(E->getArgTInfo2());
+ if (!TInfo2)
return SemaRef.ExprError();
}
if (!getDerived().AlwaysRebuild() &&
- T1 == E->getArgType1() &&
- T2 == E->getArgType2())
+ TInfo1 == E->getArgTInfo1() &&
+ TInfo2 == E->getArgTInfo2())
return SemaRef.Owned(E->Retain());
return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
- T1, T2, E->getRParenLoc());
+ TInfo1, TInfo2,
+ E->getRParenLoc());
}
template<typename Derived>