On Sep 17, 2010, at 4:00 PM, Steven Watanabe wrote:

> AMDG
> 
> The attached patch implements __is_base_of and __is_convertible_to.
> These are the last intrinsics required to compile the <type_traits> header
> that ships with MSVC 10.0.

Index: tools/clang/lib/Sema/SemaExprCXX.cpp
===================================================================
--- tools/clang/lib/Sema/SemaExprCXX.cpp        (revision 114230)
+++ tools/clang/lib/Sema/SemaExprCXX.cpp        (working copy)
@@ -1996,6 +1996,15 @@
   return false;
 }
 
+static bool CheckTypeTraitArgument(Sema& S, QualType T, SourceLocation KWLoc) {
+  QualType E = T;
+  if (T->isIncompleteArrayType())
+    E = S.getASTContext().getAsArrayType(T)->getElementType();

I know this is just a refactor, but this would be more efficient if implemented 
as

        if (const IncompleteArrayType *Array = 
S.getASTContext().getAsIncompleteArrayType(T))
                E = Array->getElementType();


+  return !T->isVoidType() &&
+      S.RequireCompleteType(KWLoc, E,
+                            diag::err_incomplete_type_used_in_type_trait_expr);
+}
+

Index: tools/clang/include/clang/AST/Expr.h
===================================================================
--- tools/clang/include/clang/AST/Expr.h        (revision 114230)
+++ tools/clang/include/clang/AST/Expr.h        (working copy)
@@ -3500,6 +3500,28 @@
   virtual child_iterator child_end();
 };
 
+class DummyExpr : public Expr {
+
+  Classification::Kinds Kind;
+
+public:
+  DummyExpr(QualType T, Classification::Kinds kind)
+    : Expr(DummyExprClass, T, false, false), Kind(kind) {}
+
+  virtual SourceRange getSourceRange() const { return SourceRange(); }
+
+  Classification::Kinds getKind() const { return Kind; }
+
+  static bool classof(const Stmt *T) {
+    return T->getStmtClass() == DummyExprClass;
+  }
+  static bool classof(const DummyExpr *) { return true; }
+
+  // Iterators
+  virtual child_iterator child_begin();
+  virtual child_iterator child_end();
+};
+
 }  // end namespace clang
 
 #endif

I'd really rather not add a new expression type just for the purpose of 
type-checking __is_convertible_to. How about we synthesize appropriate 
expressions instead, e.g., a DeclRefExpr to a synthesized variable, or a 
CallExpr to a synthesized function with an appropriate return type?

Everything else looks great.

        - Doug
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to