]> granicus.if.org Git - clang/commitdiff
Some (most) type trait expressions require that the argument passed in is a complete...
authorAnders Carlsson <andersca@mac.com>
Tue, 7 Jul 2009 19:06:02 +0000 (19:06 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 7 Jul 2009 19:06:02 +0000 (19:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74937 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExprCXX.cpp
test/SemaCXX/type-traits-incomplete.cpp [new file with mode: 0644]

index b1a73d05a45fc7449bff7b7f18d7108c7a4ab93b..32f2d519583b301806f446f0bd1b28a54705e066 100644 (file)
@@ -1549,6 +1549,9 @@ def ext_typecheck_expression_not_constant_but_accepted : Extension<
 def warn_unused_expr : Warning<"expression result unused">,
   InGroup<UnusedValue>;
 
+def err_incomplete_type_used_in_type_trait_expr : Error<
+  "incomplete type %0 used in type trait expression">;
+  
 // inline asm.
 def err_asm_wide_character : Error<"wide string is invalid in 'asm'">;
 def err_asm_invalid_lvalue_in_output : Error<"invalid lvalue in asm output">;
index 7afa5941dad9075af7a78fadf1e2b84b228453ef..b6c2d0521feb9bba598dc645dabf655f37cc420e 100644 (file)
@@ -1023,17 +1023,23 @@ Sema::OwningExprResult Sema::ActOnUnaryTypeTrait(UnaryTypeTrait OTT,
                                                  SourceLocation LParen,
                                                  TypeTy *Ty,
                                                  SourceLocation RParen) {
-  // FIXME: Some of the type traits have requirements. Interestingly, only the
-  // __is_base_of requirement is explicitly stated to be diagnosed. Indeed, G++
-  // accepts __is_pod(Incomplete) without complaints, and claims that the type
-  // is indeed a POD.
+  QualType T = QualType::getFromOpaquePtr(Ty);
+  
+  // According to http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html
+  // all traits except __is_class, __is_enum and __is_union require a the type
+  // to be complete.
+  if (OTT != UTT_IsClass && OTT != UTT_IsEnum && OTT != UTT_IsUnion) {
+    if (RequireCompleteType(KWLoc, T, 
+                            diag::err_incomplete_type_used_in_type_trait_expr,
+                            SourceRange(), SourceRange(), T))
+      return ExprError();
+  }
 
   // There is no point in eagerly computing the value. The traits are designed
   // to be used from type trait templates, so Ty will be a template parameter
   // 99% of the time.
-  return Owned(new (Context) UnaryTypeTraitExpr(KWLoc, OTT,
-                                      QualType::getFromOpaquePtr(Ty),
-                                      RParen, Context.BoolTy));
+  return Owned(new (Context) UnaryTypeTraitExpr(KWLoc, OTT, T,
+                                                RParen, Context.BoolTy));
 }
 
 QualType Sema::CheckPointerToMemberOperands(
diff --git a/test/SemaCXX/type-traits-incomplete.cpp b/test/SemaCXX/type-traits-incomplete.cpp
new file mode 100644 (file)
index 0000000..ac8ec45
--- /dev/null
@@ -0,0 +1,7 @@
+// RUN: clang-cc -fsyntax-only -verify %s 
+
+struct S; // expected-note{{forward declaration of 'struct S'}}
+
+void f() {
+  __is_pod(S); // expected-error{{incomplete type 'struct S' used in type trait expression}}
+}