[llvm-commits] [llvm-gcc-4.2] r58347 - in /llvm-gcc-4.2/trunk/gcc: cp/name-lookup.c testsuite/g++.apple/lookup-1.C

Dale Johannesen dalej at apple.com
Tue Oct 28 13:23:16 PDT 2008


Author: johannes
Date: Tue Oct 28 15:23:11 2008
New Revision: 58347

URL: http://llvm.org/viewvc/llvm-project?rev=58347&view=rev
Log:
Bring fix for PR 2867 over from Apple gcc-4.2.
Fix by Mike Stump.  His comment:
This is one of the corner cases in C++ that just 
makes the head hurt.  We don't want to find hidden 
friends from local classes during name lookup at 
this point.  Previously we would just crash.


Added:
    llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/lookup-1.C
Modified:
    llvm-gcc-4.2/trunk/gcc/cp/name-lookup.c

Modified: llvm-gcc-4.2/trunk/gcc/cp/name-lookup.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/name-lookup.c?rev=58347&r1=58346&r2=58347&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/name-lookup.c (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/name-lookup.c Tue Oct 28 15:23:11 2008
@@ -4039,8 +4039,13 @@
 
 	if (binding)
 	  {
-	    /* Only namespace-scope bindings can be hidden.  */
-	    gcc_assert (!hidden_name_p (binding));
+            /* APPLE LOCAL begin 6322334 */
+            /* Ick, we don't want to find a hidden friend inside a
+               local class!  */
+            if (hidden_name_p (binding))
+              POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE);
+            /* APPLE LOCAL end 6322334 */
+
 	    val = binding;
 	    break;
 	  }

Added: llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/lookup-1.C
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/g%2B%2B.apple/lookup-1.C?rev=58347&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/lookup-1.C (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/lookup-1.C Tue Oct 28 15:23:11 2008
@@ -0,0 +1,13 @@
+/* APPLE LOCAL file 6322334 */
+/* Radar 6322334 */
+
+class A {
+  void foo(const char* basename);
+};
+void A::foo(const char* basename) {
+  class B {
+    friend class C;
+    static void WaitForSinks(C:: /* { dg-error "has not been declared" } */
+          D* data);  /* { dg-error "expected" } */
+  };
+}





More information about the llvm-commits mailing list