]> granicus.if.org Git - clang/commitdiff
Refixed pr5086 by letting Expr::isNullPointerConstant
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 6 Oct 2009 00:09:31 +0000 (00:09 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 6 Oct 2009 00:09:31 +0000 (00:09 +0000)
handle checking for a null pointer for a zero-valued
enumerator; moving the test case from CodeGen to Sema.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83350 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
lib/Sema/SemaOverload.cpp
test/CodeGenCXX/PR5086-ambig-resolution-enum.cpp [deleted file]
test/SemaCXX/PR5086-ambig-resolution-enum.cpp [new file with mode: 0644]

index dcfd1474f16d34dd735c37da6ea826a9cd2fa3d3..7461e635c6b5f9804bcf68bcc56a2994253d1a9a 100644 (file)
@@ -1674,7 +1674,8 @@ bool Expr::isNullPointerConstant(ASTContext &Ctx,
     return true;
 
   // This expression must be an integer type.
-  if (!getType()->isIntegerType())
+  if (!getType()->isIntegerType() || 
+      (Ctx.getLangOptions().CPlusPlus && getType()->isEnumeralType()))
     return false;
 
   // If we have an integer constant expression, we need to *evaluate* it and
index 433ca79b48f0fdc8d87246caae74aa1c4f5ccccb..18614f78709666cac0fe8d945fd8e00fb853c0b6 100644 (file)
@@ -887,9 +887,6 @@ static bool isNullPointerConstantForConversion(Expr *Expr,
       Expr->getType()->isIntegralType())
     return !InOverloadResolution;
 
-  if (Expr->getType()->isEnumeralType())
-    return !InOverloadResolution;
-
   return Expr->isNullPointerConstant(Context,
                     InOverloadResolution? Expr::NPC_ValueDependentIsNotNull
                                         : Expr::NPC_ValueDependentIsNull);
diff --git a/test/CodeGenCXX/PR5086-ambig-resolution-enum.cpp b/test/CodeGenCXX/PR5086-ambig-resolution-enum.cpp
deleted file mode 100644 (file)
index 49bf799..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s &&
-// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s &&
-// RUN: clang-cc -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s &&
-// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s &&
-// RUN: true
-
-class UnicodeString {
-public:
-        enum EInvariant { kInvariant };
-        int extract(int targetCapacity, enum EInvariant inv) const;
-        int extract(unsigned targetLength, const char *codepage) const;
-};
-
-void foo(const UnicodeString& id) {
-        enum {BUFLEN = 128 };
-        id.extract(BUFLEN - 2, UnicodeString::kInvariant);
-}
-
-// CHECK-LP64: call     __ZNK13UnicodeString7extractEiNS_10EInvariantE
-
-// CHECK-LP32: call     L__ZNK13UnicodeString7extractEiNS_10EInvariantE
diff --git a/test/SemaCXX/PR5086-ambig-resolution-enum.cpp b/test/SemaCXX/PR5086-ambig-resolution-enum.cpp
new file mode 100644 (file)
index 0000000..838bc6f
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: clang-cc -fsyntax-only -verify %s -std=c++0x
+
+class C {
+public:
+        enum E { e1=0 };
+        const char * fun1(int , enum E) const;
+        int fun1(unsigned, const char *) const;
+};
+
+void foo(const C& rc) {
+        enum {BUFLEN = 128 };
+        const char *p = rc.fun1(BUFLEN - 2, C::e1);
+}